2011-03-17 23 views
6

No creo que realmente pueda agregar un campo (columna) a un IEnumerable existente. Pero lo que quiero es un nuevo IEnumerable que se derive de un IEnumerable existente con un campo calculado. El pseudocódigo en WebMatrix utilizando las páginas Web se ve así:Agregue una columna a un IEnumerable en C#

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); 

sé cómo hacer esto bucle a través de todas las filas de decir. Pero espero que haya algo más elegante.

+2

IEnumerable simplemente significa un tipo enumerable, es decir, un consumidor puede enumerar a través de su artículos constituyentes. No tiene concepto de 'campos' o 'columnas'. –

+4

@ Adam; sin embargo, creo que es probable que más personas entiendan * ese * título que, por ejemplo: "Usar una proyección para crear una nueva secuencia basada en una secuencia anterior, pero con miembros adicionales" ... –

Respuesta

6

¿Qué tal:

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

esto funciona genial, pero extrañamente ha llevado a un nuevo problema en el que el WebGrid ya no se ordena automáticamente :(. Decidí hacer una nueva pregunta. – Knox

+0

@Knox - simplemente use ie2.ToList() –

+0

Intenté ToList, pero todavía no ordenaba En lugar de transformar esta pregunta en una nueva pregunta, hice una nueva pregunta. Http://stackoverflow.com/questions/5339335/add-a-column-to-an-ienumerable-inc-c-uch-that-it -works-with-webgrid – Knox

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

Usted puede hacer esto utilizando Select. Pruebe esto:

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

El único comentario que tengo sobre esto es que la mayoría de los enlaces de datos solo miran un nivel hacia abajo; por lo general, necesita aplanar las propiedades de 'e', de lo contrario solo tendrías ac olumn llamado 'e' con' e.ToString() 'como los valores. –

+0

Si ese es el caso, tendrá que aplanar como lo muestra su respuesta. Si solo mira hacia abajo en un nivel, esperemos que el número de propiedades en 'e' sea manejable :) –

+0

No lo conseguí para que funcione inmediatamente, y decidí aplanarlo. Afortunadamente, solo hay unas 10 propiedades en e. – Knox

2

Usando Linq!

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

También, probablemente sea mejor (si piensa utilizarlo fuera de este método) hacer que se nombre ese tipo anónimo.

2

En primer lugar, el IEnumerable es probablemente una lista de algo - un objeto. Ese es el objeto que puedes extender.

es probable que pueda hacer algo como esto:

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

Cuando se involucra LINQ, no creo que sea cierto adivinar una "lista", pero claro, extender el * algo * también funcionaría –

+0

El punto es que no se trata de extender el 'IEnumerable', sino *alguna cosa*. –

Cuestiones relacionadas