2017-06-06 8 views
0

のグループに固有の値を見つけるには、私はLINQを(名前または任意の他のプロパティで)両方のグループから固有名を取得できますか二つのグループグループ

using System.Collections.Generic; 

namespace ConsoleApplication 
{ 
    internal class Student 
    { 
     public string Name; 
     public string Surname; 
     public int Mark; 
    } 

    internal class Program 
    { 
     private static void Main() 
     { 
      var twoGroups = new List<List<Student>> 
      { 
       new List<Student> 
       { 
        new Student { Name = "Anna", Surname = "Mors", Mark = 4 }, 
        new Student { Name = "Jimmy", Surname = "Lemon", Mark = 4 } 
       }, 
       new List<Student> 
       { 
        new Student { Name = "Anna", Surname = "Mors", Mark = 4 }, 
        new Student { Name = "Tommy", Surname = "Wojski", Mark = 4 }, 
        new Student { Name = "Jimmy", Surname = "Lemon", Mark = 4 } 
       } 
      }; 
     } 
    } 
} 

を持っていると思いますか?

それはトミーがある明白だが、私はLINQで彼を選ぶ(またはユニークな人物のリストを選ぶことができる方法を知ってはいけない。

UPD

はまた、私はグループを選ぶことができます含まれています唯一のユニークな学生。

using System.Collections.Generic; 

namespace ConsoleApplication 
{ 
    internal class GroupOfStudents 
    { 
     public string Code; 
     public List<Student> Students; 
    } 

    internal class Student 
    { 
     public string Name; 
     public string Surname; 
     public int Mark; 
    } 

    internal class Program 
    { 
     private static void Main() 
     { 
      var twoGroups = new List<GroupOfStudents> 
      { 
       new GroupOfStudents 
       { 
        Code = "A1", 
        Students = new List<Student> 
        { 
         new Student { Name = "Anna", Surname = "Mors", Mark = 4 }, 
         new Student { Name = "Jimmy", Surname = "Lemon", Mark = 4 } 
        } 
       }, 
       new GroupOfStudents() 
       { 
        Code = "B2", 
        Students = new List<Student> 
        { 
         new Student { Name = "Anna", Surname = "Mors", Mark = 4 }, 
         new Student { Name = "Tommy", Surname = "Wojski", Mark = 4 }, 
         new Student { Name = "Jimmy", Surname = "Lemon", Mark = 4 } 
        } 
       } 
      }; 
     } 
    } 
} 

は、私は私が右、学生を選択し、同じ名前で新しいグループに彼をプッシュする必要があると思いますか?

ユニークなのcriteriasずつ SelectMany()
  • グループにネストされたリストをflaten
  • 答えて

    2

    することができますSelectMany,GroupByCount

    IEnumerable<Student> uniqueStudents = twoGroups 
        .SelectMany(list => list) 
        .GroupBy(student => student.Name) 
        .Where(g => g.Count() == 1) 
        .Select(g => g.First()); 
    

    これは、両方の(あるいはその両方)のいずれかで複数回含まれていないだけで、学生のリストを選択します。あなたがではなく、複数のリストで同じリスト内で重複を許可する場合

    あなたはグループごとの複数のプロパティにしたい場合は、匿名型

    .GroupBy(student => new { student.Name, student.Surname }) 
    

    を使用します。

    IEnumerable<Student> uniqueStudents = twoGroups 
        .SelectMany((list, index) => list.Select(student => new { student, index })) 
        .GroupBy(x => x.student.Name) 
        .Where(g => 
        { 
         int index = g.First().index; 
         return g.Skip(1).All(x => x.index == index); 
        }) 
        .Select(g => g.First().student); 
    

    Acc。あなたの編集

    あなたは他のグループにも表示されるリストから、すべての学生を削除する場合:

    var studentNameLookup = twoGroups.SelectMany(g => g.Students).ToLookup(s => s.Name); 
    twoGroups.ForEach(g => g.Students.RemoveAll(s => studentNameLookup[s.Name].Count() > 1)); 
    
    +0

    ああ、このために答えることができので、もし、私はこの私、私のquestinonをしてください更新あなたの回答を回答としてマークします。 – ionmike

    +0

    ああ、私は第1グループに第2グループと同じ名前の学生が入っていることを意味していました。だから私たちは両方のグループからこの学生をポップします。 3人目の生徒は2番目のグループにも(名前で)含まれているので、すべてのグループからも彼をポップします。このように、私もlinqでそれを作ることができるかどうかはわかりません。 – ionmike

    +0

    2またはnグループのみで、すべてのグループではありません。 – ionmike

    3
    1. GroupBy()(私はすべてのプロパティを選択します)
    2. Where()

    ユニークなレコードを選択コード:

    List<Student> result = twoGroups.SelectMany(x => x) 
             .GroupBy(x => new { x.Name, x.Surname, x.Mark }) 
             .Where(x => x.Count() == 1) 
             .Select(x => x.First()) 
             .ToList();