有没有办法在C#中使用LINQ在同一个IEnumerable中选择两个值?

Mer*_*ith 4 c# linq

我有中有两个整数,比如一类AB:

public class MyClass {
   public int A { get; set; }
   public int B { get; set; }
   ...other stuff...
}
Run Code Online (Sandbox Code Playgroud)

我有一个MyCollection类型ObservableCollection<MyClass> 的代码,并且需要在一个列表中一起获得IEnumerable<int>所有值 - 包括AB- 和- .

我已经弄清楚如何使用相当冗长的代码(为了示例目的而将其简化为仅低于一级,但实际上是3级"from"调用并从嵌套列表中选择值):

IEnumerable<int> intsA=
    (from x in MyCollection
            select x.A);
IEnumerable<int> intsB =
    (from x in MyCollection
            select x.B);
IEnumerable<int> allInts = intsA.Concat(intsB);
Run Code Online (Sandbox Code Playgroud)

似乎应该有一种方法同时选择两个变量IEnumerable<int>.显然下面不起作用,但我喜欢这样的东西

IEnumerable<int> allInts = (from x in MyCollection select x.A, x.B);
Run Code Online (Sandbox Code Playgroud)

这样的事情是否比我上面的更优雅?

我在这里找到了如何在匿名类型中选择多个值,但这并没有使它成为相同的IEnumerable,并且仍然需要更多的代码/处理来获取项目.

(顺便说一句,使用.NET 4.5.1,如果这有所不同.)谢谢!

Mar*_*zek 13

你可以使用SelectMany:

var result = source.SelectMany(x => new[] { x.A, x.B });
Run Code Online (Sandbox Code Playgroud)

但是因为你为每个对象分配了一个新的数组,我不知道它的性能如何(或者你可能不那么关心它).

你可以GetIntValues在你的类型上声明会返回IEnumerable<int>:

public class MyClass {
   public int A { get; set; }
   public int B { get; set; }
   ...other stuff...

   public IEnumerable<int> GetIntValues()
   {
       yield return A;
       yield return B;
   }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

var result = source.SelectMany(x => x.GetIntValues());
Run Code Online (Sandbox Code Playgroud)

但是每个元素还有一个额外的分配.


Luc*_*ski 6

确实,这很容易:

IEnumerable<int> allInts = MyCollection.Select(i => i.A)
                                       .Concat(MyCollection.Select(i => i.B));
Run Code Online (Sandbox Code Playgroud)

它等同于您编写的内容,但比较冗长。它使用lambda语法而不是查询理解语法。

如果要避免其他分配,请使用它。如果您不在乎GC压力,Marcin的解决方案甚至更短。同样,这将以与解决方案不同的顺序输出元素。