2016-05-07 6 views
0

ich auf ein Problem gestoßen in meiner Arbeit vor kurzem entfernen, die folgende ist der Quellcode,LINQ IEnumerable zu handhaben und unmatch Elemente aus Untereinheit

this.NameList = new ObservableCollection<Name>(); 

     List<Others> others1 = new List<Others>(); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 

     List<Others> others2 = new List<Others>(); 
     others2.Add(new Others() { Company = "Company2", School = "School2" }); 
     others2.Add(new Others() { Company = "Company2", School = "School2" }); 
     others2.Add(new Others() { Company = "Company2", School = "School2" }); 

     List<Others> others3 = new List<Others>(); 
     others3.Add(new Others() { Company = "Company3", School = "School3" }); 
     others3.Add(new Others() { Company = "Company3", School = "School3" }); 
     others3.Add(new Others() { Company = "Company3", School = "School3" }); 

     this.NameList.Add(new Name() { FirstName = "Jacob", LastName = "Deng", Others = others1 }); 
     this.NameList.Add(new Name() { FirstName = "David", LastName = "Xu", Others = others2 }); 
     this.NameList.Add(new Name() { FirstName = "Helen", LastName = "Liu", Others = others3 }); 

please click here to see the output of above code

Und dann lesen Sie bitte den folgenden Code ein,

List<Others> others1 = new List<Others>(); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 
     others1.Add(new Others() { Company = "Company1", School = "School1" }); 

     List<Others> others2 = new List<Others>(); 
     List<Others> others3 = new List<Others>(); 

     this.NameList.Add(new Name() { FirstName = "Jacob", LastName = "Deng", Others = others1 }); 
     this.NameList.Add(new Name() { FirstName = "David", LastName = "Xu", Others = others2 }); 
     this.NameList.Add(new Name() { FirstName = "Helen", LastName = "Liu", Others = others3 }); 

Please click here for the output of the second snippet code

Von den obigen zwei Snippets können Sie bemerken, dass das zweite Snippet keine Einträge in other2 und other3 enthält. Dies können Sie leicht anhand der Vorschauausgabe nachvollziehen.

Jetzt kommt die Frage, wie verwenden wir LINQ zu IEnumerable, um solchen Fall zu behandeln, wie LINQ zu verwenden, um diese Elemente von Entität Others zu entfernen? aber wir müssen behalten, dass other2 und other3 nicht null sind (behalte, dass count 0 ist). Gibt es neben LINQ noch andere Lösungen?

Ich habe versucht, die folgenden zu verwenden, scheiterte aber,

var others = ((MyVM)DataContext).NameList.Select(n => n.Others.Where(o => o.School == "School1")).ToList(); 

ich einige Test nur haben, wenn wir nicht LINQ verwenden, dann können wir das folgende Snippet-Code verwenden, um meine es zu beheben.

Aber es sieht sehr redundant aus, und wir wissen, dass LINQ sehr nützlich ist und ich glaubte, dass es mit LINQ behoben werden kann. Hoffe, jemand könnte mir helfen, es mit LINQ zu beheben, danke.

Schätzen Sie, wenn mir jemand helfen könnte. Danke vielmals.

+0

Versuchen Sie diese: var andere = ((myvm) Datacontext) .NameList.Select (n => n.Others.Select (o => (o.Schule == "Schule1")? o: "Code hier hinzufügen, um etwas anderes zu tun")). ToList(); – jdweng

+0

Dank Jdweng, ich möchte nur die Elemente entfernen, die Schule ist nicht gleich 'School1' mit LINQ, und die Ausgabe ist das gleiche wie der zweite Code-Schnipsel wie oben erwähnt. Kannst du mir helfen? – Jacob

+0

Es bedeutet, wenn o.School! = 'School1', dann entfernen Sie den Artikel von anderen Entität – Jacob

Antwort

2

Es ist besser, List<T>.RemoveAll in Ihrem Fall zu verwenden. Weitere Informationen finden Sie unter Using LINQ to remove elements from a List<T>.

ObservableCollection<Name> nameList = ((MyVM)DataContext).NameList; 
foreach(Name n in nameList) 
{ 
    n.Others.RemoveAll(s => s.School != "School1"); 
} 

Linq ist gut im Lesen statt Iterieren statt Aktualisieren/Löschen. Wenn Sie darauf bestehen, Linq zu verwenden, müssen Sie jedes Element neu konstruieren.

var newList = from nl in this.namelist 
       // this list can be empty but never null 
       let notSchool1 = (from s in nl.Others 
            where s.School != "School1" 
            select s).ToList() 
       select new Name 
       { 
        FirstName = nl.FirstName, 
        LastName = nl.LastName, 
        Others = noSchool1 
       }; 
this.NameList = new ObservableCollection<Name>(newList); 

Above-Code kann andere Funktionalitäten in Ihrer Anwendung brechen, weil diese Elemente sind beobachtet.

+0

Vielen Dank für Ihre Hilfe. Sehr schöner Code! @ qxg – Jacob

0

Wie ich Ihre Frage verstehe, Sie möchten andere entfernen, deren Schulwert nicht "School1" ist. Es gibt verschiedene Möglichkeiten dafür, aber ich empfehle, die Daten von Namelist, die Sie wollen, zu filtern.

Sie unter Code versuchen können, auf andere Liste zu bekommen mit 'School1'

var result = NameList.Select(name => new Name() 
      { 
       FirstName = name.FirstName, 
       LastName = name.LastName, 
       Others = name.Others.Where(obj => obj.School == "School1").ToList() 
      } 
      ).ToList(); 
Verwandte Themen