我有一个对象数组,其中包含属性Number。我需要按值对它们进行分组,即对象包含那些样本值:
1 2 3 3 3 4 5 6 6 6 7 7
我必须像这样分组:
listOfUniqe = {1,2,4,5}
listOfDuplicates1 = {3,3,3}
listOfDuplicates2 = {6,6,6}
listOfDuplicates3 = {7,7}
...
我尝试使用distinct First()
。但这使我首次出现并删除重复。我想删除对象的第一次出现,如果它有重复并将它们移动到另一个列表。
List<Reports> distinct = new List<Reports>;
distinct = ArrayOfObjects.GroupBy(p => p.Number).Select(g => g.First()).ToList();
我有什么想法可以做到这一点?
答案 0 :(得分:4)
要获得只有一个元素的组,请使用:
distinct = ArrayOfObjects.GroupBy(p => p.Number)
.Where(g => g.Count() == 1)
.ToList();
要获得包含更多元素的组列表,请使用:
nonDistinct = ArrayOfObjects.GroupBy(p => p.Number)
.Where(g => g.Count() > 1)
.Select(g => g.ToList())
.ToList();
答案 1 :(得分:4)
首先对项目进行分组:
var groups = values.GroupBy(p => p.Number).ToList();
唯一的是组数为1的那些:
var unique = groups.Where(g => g.Count() == 1).Select(g => g.Single()).ToList();
有重复的那些是其他的:
var nonUnique = groups.Where(g => g.Count() > 1).ToList();