2011-03-17 41 views
6

我不認爲我實際上可以將字段(列)添加到現有的IEnumerable中。但我想要的是從現有的具有計算字段的IEnumerable派生的新IEnumerable。 WebMatrix使用網頁中的僞代碼看起來像:在c#中添加一列到IEnumerable中#

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只是表示一個枚舉類型,即消費者可以枚舉通過它的組成項目。它沒有'領域'或'專欄'的概念。 – 2011-03-17 11:45:16

+4

@亞當 - 但我認爲更多的人可能會理解*標題,比如:「使用投影創建基於舊序列的新序列,但使用額外的成員」... – 2011-03-17 11:48:26

回答

6

如何:

var ie2 = ie.Select(x => new { x.Foo, x.Bar, Sum = x.Abc + x.Def }); 
var grid = new WebGrid(ie2); 
+0

這很好,但奇怪的是導致了一個新的問題,WebGrid不再自動排序:(我決定讓它成爲一個新問題。) – Knox 2011-03-17 12:35:44

+0

@Knox - 只是使用ie2.ToList() – 2011-03-17 12:44:15

+0

我試過ToList,但它仍然沒有排序。而不是將這個問題轉化爲新問題,我問了一個新問題。http://stackoverflow.com/questions/5339335/add-a-column-to-an-ienumerable-in-c-such-that-it -works-with-webgrid – Knox 2011-03-17 13:01:47

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

可以使用Select做到這一點。試試這個:

ie2 = ie.Select(e => new { IE = e, NewParam = e.X+e.Y }); 
+1

我對此有一個評論,那就是大多數數據綁定只看上去一層;你通常需要將屬性弄平'e',否則你只需要交流用'e.ToString()'作爲值命名爲'e'的olumn。 – 2011-03-17 11:46:37

+0

如果是這樣的話,你將不得不平坦的答案描繪。如果它只看上去一層,那麼我們希望'e'上的屬性數量是可控的:) – 2011-03-17 11:48:46

+0

我沒有得到這個立即工作,並決定平整它。幸運的是,e上只有大約10個屬性。 – Knox 2011-03-17 12:35:09

2

使用Linq!

var newIe = from item in ie 
      select new {item.NewField, item.OldFiedl1 etc... } 

而且,可能是最好的(如果你打算在這個方法以外使用)進行命名的匿名類型。

2

首先,IEnumerable大概是的東西 - 一個對象。這是您可以擴展的對象。

你或許可以做這樣的事情:

var ie = db.Query(...); 
var ie2 = ie.Select(i => new MyIe2Object { 
    Prop1 = i.Prop1, 
    NewProp = i.Prop1 + i.Prop2 
}); 
+0

當LINQ參與時,我不認爲猜對「列表」是真的 - 但是肯定的是,擴展* something *也會起作用 – 2011-03-17 11:49:43

+0

關鍵是它並不是真的要擴展IEnumerable,而是* *的東西。 – 2011-03-17 12:04:46