2017-06-06 104 views
0

想我有兩組找到獨特的價值

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?

很明顯有湯米,但我不知道我怎麼能在他的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 } 
        } 
       } 
      }; 
     } 
    } 
} 

我想我需要挑選學生,把他推向同名新組,對不對?

回答

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

加。您編輯

如果你想從中也出現在其他組列表中刪除所有學生:

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

哦,我的意思是第一組包含與第二組同名的學生。所以我們從這兩個組中挑選了這個學生。第三名學生也包含在第二組(名稱),所以我們也從所有組中挑選他。像這樣,我甚至不確定我們可以用linq做到。 – ionmike

+0

只有2或n組,而不是每組。 – ionmike

3
  1. flaten嵌套表到一個SelectMany()
  2. 組由唯一指標分析GroupBy()(我選擇的所有屬性)
  3. 選擇唯一的記錄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();