在C#中为IEnumerable添加一列

8

我认为我不能实际上向现有的IEnumerable中添加一个字段(列)。但是我的要求是,从一个已有的IEnumerable中派生出一个新的IEnumerable,并带有一个计算字段。在WebMatrix使用Web Pages的伪代码如下:

var db = Database.Open("LOS");
var ie = db.Query(sqlAssignments);

// make a new ie2 that has an extra field
// ??? ie2 <=== ie with new field c = ie.a + ie.b

var grid = new WebGrid( ie2, extra parameters );

我知道如何在ie中循环遍历所有行,但我希望有更优雅的方法。


2
IEnumerable表示可枚举类型,即消费者可以枚举其组成项。它没有“字段”或“列”的概念。 - Adam Ralph
4
@Adam- 我认为更多的人可能会理解“使用投影创建一个基于旧序列但具有额外成员的新序列”这样的标题,而不是例如:“使用投影创建一个基于旧序列但具有附加成员的新序列”…… - Marc Gravell
5个回答

6
如何呢:
var ie2 = ie.Select(x => new { x.Foo, x.Bar, Sum = x.Abc + x.Def });
var grid = new WebGrid(ie2);

这个很好用,但奇怪的是它导致了一个新问题,WebGrid不再自动排序了 :(。我决定提一个新的问题。 - Knox
@Knox - 只需使用ie2.ToList() - Marc Gravell
我尝试使用ToList,但它仍然没有排序。与其将这个问题转化为新问题,我问了一个新问题。http://stackoverflow.com/questions/5339335/add-a-column-to-an-ienumerable-in-c-such-that-it-works-with-webgrid - Knox
3
有点烦人:如果你有20列甚至更多会怎样? - Arman Bimatov

4
你可以使用 Select 完成此操作。尝试以下代码:
ie2 = ie.Select( e => new { IE = e, NewParam =  e.X+e.Y });

1
我对此的唯一评论是,大多数数据绑定只查看一级;通常需要展开 e 的属性,否则你将只得到一个名为 e 的列,其值为 e.ToString() - Marc Gravell
如果是这种情况,你将不得不像你的答案所描述的那样展平它。如果它只向下查看一个级别,希望 e 上的属性数量是可管理的 :) - Øyvind Bråthen
我没有立即使它工作,决定将其展平。幸运的是,e上只有大约10个属性。 - Knox

3
ie2 = ie.Select(v => new {v.a, v.b, c = v.a + v.b});

2
首先,IEnumerable 可能是一组 某种东西 - 一个对象。这就是您可以扩展的对象。
您可能可以像这样做:
var ie = db.Query( ... );
var ie2 = ie.Select(i => new MyIe2Object {
   Prop1 = i.Prop1,
   NewProp = i.Prop1 + i.Prop2
});

当涉及到LINQ时,我认为猜测一个“列表”并不是正确的做法 - 但是,扩展某些内容也可以起作用。 - Marc Gravell
重点不在于扩展IEnumerable,而在于 某些内容 - Mikael Östberg

2
使用Linq!
var newIe = from item in ie
            select new {item.NewField, item.OldFiedl1 etc... }

此外,如果您打算在此方法之外使用,请最好将该匿名类型命名。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接