如何使用c#linq

时间:2018-10-15 16:53:55

标签: c# list linq

我有一个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从列表中删除相同颜色的产品。我该怎么办?

2 个答案:

答案 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);
            }
        }