2017-06-06 179 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();