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

C#LINQ从列表中获取重复项

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);

继续重复你的重复!