C#LINQ从列表中获取重复项
本文关键字:获取 列表 C#LINQ | 更新日期: 2023-09-27 18:21:34
我有一个对象列表,其中包含一个字符串、int和另一个int。我希望能够创建一个包含所有具有重复字符串的对象的列表。
以下是我目前所拥有的:
MyObject duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.ToList();
我得到的错误是,我无法隐式转换类型System.Collections.Generic.List<string, MyObject> to MyObject
var duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.SelectMany(g=>g)
.ToList();
您需要编写
List<MyObject> duplicates = allMyObjects.GroupBy(a => a.MyString)
.Where(a => a.Count() > 1)
.ToList();
您可以使用ToLookup
制作一个包含所需所有信息的漂亮数据结构
var objectsByString = allMyObjects.ToLookup(o => o.MyString);
这将返回一个Lookup<string, MyObject>
。您可以使用获取重复字符串
var duplicateStrings = objectsByString.Where(l => l.Count()>1).Select(l => l.Key);
其将返回具有重复字符串的CCD_ 5。而且,对于每个重复项,您可以使用以下方法访问具有重复项的实际对象:
string duplicateKey = duplicateStrings.First();
var duplicateObjects = objectsByString[duplicateKey]
其返回具有具有该字符串的项目的CCD_ 6。
有几个问题,第一个问题是MyObject的List不能分配给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);
继续重复你的重复!