我需要找到位于对象集合的方法调用中的重复电子邮件地址。
在这种情况下,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();
理想情况下,我希望能够获得重复人物对象的原始列表,以便我可以直接使用这些键。
任何提示将不胜感激。
答案 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();
我希望它可以帮到你!