如何在 Linq 查询中将 select 多个元素放入数组中?

How to select multiple elements into array in Linq query?

网络核心应用。我的应用程序中有以下查询

 var result  = sourceProposal.Quotes
      .Where(x=>x.QuotationId == sourceQuoteId)
      .FirstOrDefault()
      .QuoteLines.Select(x=>(x.Quantity,x.WtgType)).ToArray();

这会产生两个数组元素,例如

0 element   1, "string1"
1 element   2, "string2"

我期待的是

(int[] sourceQuantity, string[] destinationTurbineType) = sourceProposal.Quotes
           .Where(x=>x.QuotationId == sourceQuoteId)
           .FirstOrDefault()
           .QuoteLines.Select(x=>(x.Quantity,x.WtgType)).ToArray();

我想复制到具有 int[] sourceQuantity 的元组,string[] destinationTurbineType 这段代码不起作用并且抛出错误不包含析构函数的定义并且没有可访问的扩展方法 Descontruct 接受第一个参数输入 int(sourceQuantity, string destinationTurbineType)[].

谁能帮我把值复制到 sourceQuantitydestinationTurbineType。任何帮助,将不胜感激。谢谢

Select<TSource,TResult> returns enumerable/queryable 选择器返回的类型 (IEnumerabe<TResult>/IQueryable <TResult>).

如果你想用 LINQ 实现这个,你可以使用 Aggregate:

// note that sourceQuantity and destinationTurbineType would be lists, not arrays
var (sourceQuantity, destinationTurbineType) = sourceProposal.Quotes
    .Where(x=>x.QuotationId == sourceQuoteId)
    .FirstOrDefault()
    .QuoteLines
    .Aggregate((ints: new List<int>(), strs: new List<string>()), (aggr, curr) =>
    {
        aggr.ints.Add(curr.Quantity);
        aggr.strs.Add(curr.WtgType);
        return aggr;
    });

或者只使用简单的 for 循环并将数据复制到目标数组(可能移动到某种扩展方法)。沿着这条线:

var quoteLines = sourceProposal.Quotes
    .Where(x=>x.QuotationId == sourceQuoteId)
    .FirstOrDefault()
    .QuoteLines; // assuming it is materialized collection with indexer like an array or list
int[] sourceQuantity = new int[quoteLines.Length]; // or Count
string[] destinationTurbineType = new string[quoteLines.Count()];
for(int i = 0; i < quoteLines.Length; i++)
{
   var curr = quoteLines[i];
   sourceQuantity[i] = curr.Quantity;
   destinationTurbineType[i] = curr.WtgType;
}

目前没有 built-in LINQ 方法可以做到这一点。但是您可以编写自己的扩展方法。类似于以下内容:

public static class EnumerableExtensions
{
    public static (TFirst[] xs, TSecond[] ys) Unzip<TFirst, TSecond>(this IEnumerable<(TFirst, TSecond)> zipped)
    {
        var xs = new List<TFirst>();
        var ys = new List<TSecond>();
        foreach (var (x, y) in zipped)
        {
            xs.Add(x);
            ys.Add(y);
        }
        return (xs.ToArray(), ys.ToArray());
    }
}

var (xs, ys) =
    new[] { 1, 2, 3 }
    .Zip(new[] { "a", "b", "c" })
    .Unzip();

Console.WriteLine(string.Join(", ", xs)); // 1, 2, 3
Console.WriteLine(string.Join(", ", ys)); // a, b, c

或者在您的示例中,您可以使用:

(int[] sourceQuantity, string[] destinationTurbineType) = sourceProposal.Quotes
           .Where(x=>x.QuotationId == sourceQuoteId)
           .FirstOrDefault()
           .QuoteLines.Select(x=>(x.Quantity,x.WtgType)).Unzip();