2017-01-02 3 views
0

Ich habe eine Liste, die einige Eigenschaften und eine Liste enthält. Ich möchte die einzigartige Datensätze auszuwählen, basierend auf der Eigenschaft der inneren Liste, wie kann ich es LINQ Beispiel ListeWählen Sie die verschiedenen Daten aus der Liste mit LINQ

{item1 = 1, item2=2,list{a1=l1,a2=l2,a3=l5},item3 =3} 
{item1 = 21, item2=21,list{a1=l11,a2=l2,a3=l3},item3 =3} 
{item1 = 31, item2=22,list{a1=l12,a2=l2,a3=l3},item3 =3} 
{item1 = 41, item2=23,list{a1=l1,a2=l2,a3=l3},item3 =3} 

Ich möchte mit erreichen, den Datensatz wählen, die unterschiedliche Wert der Eigenschaft „a1“ .Wenn ich doppelten Wert von „a1“ gefunden, dann wird i Wert „a3“ = „l5“

Erwartetes Ergebnis vergleichen:

{item1 = 21, item2=21,list{a1=l11,a2=l2,a3=l3},item3 =3} 
{item1 = 31, item2=22,list{a1=l12,a2=l2,a3=l3},item3 =3} 
{item1 = 41, item2=23,list{a1=l1,a2=l2,a3=l3},item3 =3} 
+0

Können Sie die Struktur Ihrer Klassen bieten? Ich bin nicht sicher zu verstehen, wie Sie sie gebaut haben (sieht aus wie Dictionnary zu mir) – fharreau

+0

Leppie unten ist die ähnliche Struktur – Pavan

Antwort

0

Zuerst Sie GROUPBY innerhalb dieser Gruppierung auf Ihre innere Liste a1 und wählen Sie dann wollen für a3! = "l5".

List<foo> col = new List<foo>(); 
List<string> tmp = new List<string> {"l1","l2","l5"}; 
col.Add(new foo {item1 = 1, item2=2,lst=tmp,item3 =3}); 
tmp = new List<string> {"l11","l2","l3"}; 
col.Add(new foo {item1 = 21, item2=21,lst=tmp,item3 =3}); 
tmp = new List<string> {"l12","l2","l3"}; 
col.Add(new foo {item1 = 31, item2=22,lst=tmp,item3 =3}); 
tmp = new List<string> {"l1","l2","l3"}; 
col.Add(new foo {item1 = 41, item2=23,lst=tmp,item3 =3}); 

var qry = col.GroupBy(i => i.lst[0]).Select(g => g.Where(j => j.lst[2]!="l5")); 

Wenn es mehrere Duplikate, wo Ihre a3 nicht „l5“ ist, werden Sie alle von ihnen, so dass Sie auf etwas anderes filtern müssen, wenn dies nicht erwünscht ist.

+0

Hallo Jim danke für den Versuch, aber in Ihrem Fall sind Sie in Betracht Liste der Zeichenfolge, in meinem Fall ist es auch eine Liste von Objekten . Also i.lst [index] ist möglicherweise nicht möglich. – Pavan

+0

In diesem Fall können Sie einfach auf die Elemente des Unterobjekts zugreifen. –

0
class Log 
{ 
    public int DoneByEmpId { get; set; } 
    public string DoneByEmpName { get; set; } 

    } 

public class Class1 
{ 
    static void Range() 
    { 
     var array = new List<Log>() {new Log() {DoneByEmpId = 1,DoneByEmpName = "Jon"}, 
      new Log() { DoneByEmpId = 1, DoneByEmpName = "Jon" } , 
      new Log() { DoneByEmpId = 2, DoneByEmpName = "Max" }, 
      new Log() { DoneByEmpId = 2, DoneByEmpName = "Max" }, 
      new Log() { DoneByEmpId = 3, DoneByEmpName = "Peter" }}; 

     var ordered = 
      array.GroupBy(x => x.DoneByEmpId).ToList().Select(x => x.FirstOrDefault()).OrderBy(x => x.DoneByEmpName); 
     foreach (var item in ordered) 
     { 
      Console.WriteLine(item.DoneByEmpName); 
     } 
    } 
} 

Ergebnis:
Jon
Max
Peter

Verwandte Themen