我有中有两个整数,比如一类A和B:
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>所有值 - 包括A和B- 和- .
我已经弄清楚如何使用相当冗长的代码(为了示例目的而将其简化为仅低于一级,但实际上是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)
但是每个元素还有一个额外的分配.
确实,这很容易:
IEnumerable<int> allInts = MyCollection.Select(i => i.A)
.Concat(MyCollection.Select(i => i.B));
Run Code Online (Sandbox Code Playgroud)
它等同于您编写的内容,但比较冗长。它使用lambda语法而不是查询理解语法。
如果要避免其他分配,请使用它。如果您不在乎GC压力,Marcin的解决方案甚至更短。同样,这将以与解决方案不同的顺序输出元素。
| 归档时间: |
|
| 查看次数: |
3812 次 |
| 最近记录: |