我有一个c#产品列表:
var mylist = new List<Person>{
new Product{Id=1, Name="p-1", Colors="1,2"},
new Product{Id=2, Name="p-2", Colors="2,1"},
new Product{Id=3, Name="p-2", Colors="3,4,5"},
new Product{Id=4, Name="p-2", Colors="4,5,3"}
}
如果一个产品颜色为“ 1,2”,而另一个产品颜色为“ 2,1”,则这些产品为相同颜色。所以我想删除其中一个(没关系)。最终列表将如下所示:
var mylist = new List<Person>{
new Product{Id=1, Name="p-1", Colors="1,2"},
new Product{Id=3, Name="p-2", Colors="3,4,5"}
}
我无法使用c#linq从列表中删除相同颜色的产品。我该怎么办?
答案 0 :(得分:3)
您可以按颜色对颜色进行分组和分类,因为您说的并不重要,可以从每个组中获得第一个颜色(我认为List是一个错字):
var mylist = new List<Product>{
new Product{Id=1, Name="p-1", Colors="1,2"},
new Product{Id=2, Name="p-2", Colors="2,1"},
new Product{Id=3, Name="p-2", Colors="3,4,5"},
new Product{Id=4, Name="p-2", Colors="4,5,3"}
};
var result = mylist
.GroupBy(m => string.Join(",",m.Colors.Split(',').Select(c => c.Trim()).OrderBy(c => c)))
.Select(m => new Product {
Id=m.First().Id,
Name=m.First().Name,
Colors=m.Key});
答案 1 :(得分:0)
我在person类中添加了一个string[]
类型的属性以使其简单。这些逗号分隔的值没有用,因此此属性在进一步处理中也将很有用。
var persons = new List<Person>{
new Person{Id=1, Name="p-1", Colors="1,2"},
new Person{Id=2, Name="p-2", Colors="2,1"},
new Person{Id=3, Name="p-2", Colors="3,4,5"},
new Person{Id=4, Name="p-2", Colors="4,5,3"}
};
persons.ForEach(x => x.ColorList = x.Colors.Split(','));
var distinctPerson = new List<Person>();
foreach (var item in persons)
{
var isExist = distinctPerson.Any(x => x.ColorList.Intersect(item.ColorList).Any());
if(!isExist)
{
distinctPerson.Add(item);
}
}