繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM