2017-11-01 2 views
0

ich generische Liste foo haben, wie untenbekommen spezifischen Eigenschaften innerhalb der generischen Liste mit Linq

var foo = new List<XYZ>(); 
public class XYZ 
{ 
    public String TimeZone { get; set; } 
    public Decimal? B1Volume { get; set; } 
    public Decimal? B2Volume { get; set; } 
    public Decimal? B3Volume { get; set; } 
    public Decimal? B4Volume { get; set; } 
    public Decimal? B5Volume { get; set; } 
    // ............. 
    // ............. 
    public Decimal? B24Volume { get; set; } 
    public String Name {get;set;} 
} 

gezeigt, wie kann ich die Eigenschaften wählen B1Volume,........B24Volume ?

Ich habe versucht, mit folgenden Code unten erwähnt, aber es ist nicht zu geben erwartete Ergebnisse

var hp = foo.Skip(1).Take(23).ToList(); 
+0

Natürlich hilft es nicht. 'Skip',' Take' ... arbeitet an Objekten, nicht an ihren Eigenschaften. Es funktioniert, wenn Sie eine Liste wie folgt haben: '{xyz1, xyz2 .... xyz24}' –

Antwort

0

Vielleicht hilft es:

XYZ xyz = new XYZ(); 
Type t = xyz.GetType(); 
List<PropertyInfo> properties = new List<PropertyInfo>(t.GetProperties()); 
var hp = properties.Skip(1).Take(23).ToList(); 

Vergessen Sie nicht, Namensraum hinzugefügt:

using System.Reflection; 

aktualisieren

In Kommentaren GBreen12 für immer nur Eigenschaften eines Filters hinzufügen lässt vermuten, dass hat Name mit volume. Wenn Sie nun weitere Eigenschaften hinzufügen, wird der Code nicht fehlschlagen. So können Sie die 3. Zeile dies ändern:

List<PropertyInfo> properties = (new List<PropertyInfo>(t.GetProperties())).Where(x => x.Name.EndsWith("Volume")).ToList(); 

Jetzt brauchen Sie nicht letzte Zeile var hp = ... und die properties ist Ihre Antwort.

+2

Ich würde vorschlagen, nicht anzunehmen, dass die Rückkehr von 'GetProperties' die gleiche Reihenfolge wie die Deklaration ist (obwohl das mit dem aktuellen Fall der Fall ist) Compiler) und filtern Sie nach den Eigenschaftsnamen. – NetMage

+0

@NetMage Ich habe die exakte Klasse 'XYZ' getestet und die Eigenschaften sind in der gleichen Reihenfolge. –

+1

@FarzinKanzi Ich denke, NetMage versucht zu sagen, dass es nicht wirklich sicher ist, die Reihenfolge der Eigenschaften aus verschiedenen Gründen anzunehmen. Selbst wenn sie jetzt in der richtigen Reihenfolge zurückkehren, könnte sich die Objektdefinition auf verschiedene Arten ändern, die das vermasseln würden. – GBreen12

1

Es gibt ein paar Möglichkeiten, aber ich glaube nicht, dass Sie diesen Weg gehen wollen. Wollen Sie wirklich eine Liste von xyz? Oder anders gefragt: Haben Sie viele verschiedene Listen von Volumenlisten? Oder möchten Sie nur eine einzige Liste von Bänden ausdrücken?

Vielleicht ein Array innerhalb XYZ wie dieses

public class XYZ 
{ 
    public String TimeZone { get; set; } 
    public Decimal?[] Volumes {get; set;} = new Decimal?[24]; 
    public String Name {get; set;} 
} 

tun, was Sie wollen, ist erklären Wenn Sie Volumen durch einen Index zugreifen möchten (1,2, ..., 24) benötigen Sie ein Array oder jede andere Art von indizierter Datenstruktur.

Dann könnten Sie

var xyz = new XYZ(); 
xyz.Volumes[0] = 12.0; 
xyz.Volumes[1] = 23.0; 
..... 

tun und greifen im Grunde die Volumina von xyz.Volumes und das Hinzufügen eines Index, der die n-te Volumen

Wenn Sie jetzt Sie weitere Liste könnte diese XYZ erhalten möchten so etwas tun:

var listOfXyz = new List<XYZ>(); 
listOfXyz.Add(new XYZ()); 
.... 
listOfXyz[3].Volumes 

dies würde Ihnen die 24 Bände des Elements bei Index 3 in der Liste.

1

Sie benötigen ein Select zu tun:

var hp = foo.Select(x => new { x.BVolume1, x.BVolume2, ..., x.BVolume24 }); 

Obwohl ich mit @Himzo damit einverstanden, dass dies nicht der beste Weg ist, um Ihr Problem zu lösen, wenn Sie die Struktur ändern können.

Verwandte Themen