[英]C# LINQ getting duplicates from a list
我有一个对象列表,该对象具有一个字符串,一个int和另一个int。 我希望能够创建具有重复字符串的所有对象的列表。
这是我到目前为止的内容:
MyObject duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.ToList();
我收到的错误是我无法将类型System.Collections.Generic.List<string, MyObject> to MyObject
隐式转换System.Collections.Generic.List<string, MyObject> to MyObject
你需要写
List<MyObject> duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.ToList();
var duplicates = allMyObjects.GroupBy(a => a.MyString) .Where(a => a.Count() > 1) .SelectMany(g=>g) .ToList();
有几个问题,第一个是无法将MyObject列表分配给MyObject,因此让我们使用var
来忽略它。
var duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.ToList();
现在, duplicates
的类型为List<IGrouping<string, MyObject>>
(尽管错误报告了错误消息)。 糟糕,您必须摆脱(或写代码来说明)这些小组!
var duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.SelectMany(g => g)
.ToList();
现在,从具有不止一项的每个组中选择了每个(“被选中的多个”)对象之后, duplicates
的类型为List<MyObject>
。 更好,但这仍然不是MyObject
。 好吧,这很好:修复变量的声明类型( var
以前是自动执行的)。
List<MyObject> duplicates = /* same as before */;
或者让var
来完成它,如果IEnumerable<MyObject>
很好,只需省略ToList:
var duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.SelectMany(g => g);
继续并重复您的重复项!
您可以使用ToLookup
使用所需的所有信息制作一个漂亮的数据结构
var objectsByString = allMyObjects.ToLookup(o => o.MyString);
这将返回Lookup<string, MyObject>
。 您可以使用以下方法获取重复的字符串:
var duplicateStrings = objectsByString.Where(l => l.Count()>1).Select(l => l.Key);
这将返回带有重复字符串的IEnumerable<string>
。 而且,对于每个重复项,您可以使用类似以下内容的方法访问具有重复项的实际对象:
string duplicateKey = duplicateStrings.First();
var duplicateObjects = objectsByString[duplicateKey]
返回带有该字符串的项目的IEnumerable<MyObject>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.