Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法在C中使用LINQ将两个值选择到同一个IEnumerable中?_C#_Linq - Fatal编程技术网

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

C# 有没有办法在C中使用LINQ将两个值选择到同一个IEnumerable中?,c#,linq,C#,Linq,我有一个类,其中有两个整数,例如a和B: 我在代码中有一个类型为ObservableCollection的MyCollection,需要在一个列表中获得所有值(a和B)的IEnumerable 我已经找到了如何使用非常详细的代码来实现这一点,例如,将代码大大简化为下面的一个级别,但实际上是三个级别的from调用和从嵌套列表中选择值: IEnumerable<int> intsA= (from x in MyCollection select x.A);

我有一个类,其中有两个整数,例如a和B:

我在代码中有一个类型为ObservableCollection的MyCollection,需要在一个列表中获得所有值(a和B)的IEnumerable

我已经找到了如何使用非常详细的代码来实现这一点,例如,将代码大大简化为下面的一个级别,但实际上是三个级别的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);
似乎应该有一种方法可以同时将两个变量选择到同一个IEnumerable中。显然,下面的方法不管用,但我喜欢这样的方法

IEnumerable<int> allInts = (from x in MyCollection select x.A, x.B);
有没有比我上面提到的更优雅的东西

我发现了如何将多个值选择到一个匿名类型中,但这并不能使它成为同一个IEnumerable,并且仍然需要更多的代码/处理才能将项目取出


顺便说一句,使用.NET4.5.1,如果有区别的话。谢谢

这确实很简单:

IEnumerable<int> allInts = MyCollection.Select(i => i.A)
                                       .Concat(MyCollection.Select(i => i.B));
它与您所写的内容相同,但不太冗长。它使用lambda语法而不是查询理解语法

如果要避免额外分配,请使用它。如果你不关心GC压力,Marcin的解决方案甚至更短。此外,这会以不同于其解决方案的顺序输出元素。

您可以使用SelectMany:

但因为您要为每个对象分配一个新数组,所以我不知道它的性能如何,或者您可能不太关心它

您可以在返回IEnumerable的类型上声明GetIntValue:


但是每个元素仍然有一个额外的分配。

@MattBurland这不会导致IEnumerableled订单问题吗?我继续假设他是指选择新[]{x.A,x.B}订单不重要。只需要全部!我猜投票人没有仔细看。新的{x.a,x.B}和新的{x.a,x.B}之间有很大的区别,你所做的在我看来是正确的。这是解决OP问题的一个非常标准的方法可能是不喜欢这个问题的人不确定为什么,这对我来说是一个体面的问题,并决定否决任何敢于回答这个问题的人。@MattBurland对此表示怀疑,因为他们没有对所有其他答案投反对票。@Servy:到目前为止,每个答案都有一个反对票。问题也是-2/+2。谢谢!这让我找到了我需要的地方。不幸的是,我本周确实加入了这个网站,所以我还没有足够的声誉来标记为“答案”或“投票”,但如果我可以,我会这样做,以后也会这样做!不客气。正如你们所知道的,并没有声誉需要标记一个答案为接受,但你们需要15个代表才能投票。查看页面了解更多信息,欢迎访问SO;
IEnumerable<int> allInts = MyCollection.Select(i => i.A)
                                       .Concat(MyCollection.Select(i => i.B));
var result = source.SelectMany(x => new[] { x.A, x.B });
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;
   }
}
var result = source.SelectMany(x => x.GetIntValues());