无效的匿名类型成员声明符 - 匿名类型+ Nullable运算符

时间:2016-03-21 19:57:52

标签: c# linq

我需要找到位于对象集合的方法调用中的重复电子邮件地址。

在这种情况下,GroupBy的正确语法是什么?

// PsuedoCode

Person
{
   List<string> GetEmails();
   public string Name {get;set;}
   public int Identity {get;set;}
} 

List<Person> People = GetPeopleFromDatabase();

var  duplicateEmail =   
     people.GroupBy(x =>  x.GetEmails()??????? )
      .Where(g=> g.Count() > 1) 
      .Select(y => y)
      .ToList();

理想情况下,我希望能够获得重复人物对象的原始列表,以便我可以直接使用这些键。

任何提示将不胜感激。

3 个答案:

答案 0 :(得分:2)

您需要首先展平电子邮件列表,然后再进行分组。

var query =
    from p in people
    from e in p.GetEmails()
    group p by e into g
    where g.Count() > 1
    select g;

答案 1 :(得分:1)

同意@JeffMercado,恕我直言,它使用查询语法更简单,更易读。无论如何,这是一个使用方法语法的解决方案:

var query = people.SelectMany(p=> p.GetEmails(), (person, email) => new { person, email})
                  .GroupBy(e=>e.email, e=>e.person)
                  .Where(g=>g.Count()>1);

展平电子邮件列表的关键是SelectMany扩展方法。

答案 2 :(得分:0)

除了Jeff Mercado提供的答案之外,我还会提醒您返回仅包含重复电子邮件的字符串列表。 它会是这样的:

var query =
    (from p in people
     from e in p.GetEmails()
     group p by e into g
     where g.Count() > 1
     select g).Select(x => x.Key).ToList();

我希望它可以帮到你!