使用.GroupBy删除列表重复项,并保留第一个列表中的值

时间:2014-09-08 23:29:45

标签: c# linq

使用.GroupBy()我能够组合这个列表,

AppleId    Color
----------------
1          Green
1          Red
2          Red
3          Green
4          Red
4          Green

进入此列表:

AppleId    Green   Red
------------------------
1           1       1
2           0       1
3           1       0
4           1       1

已删除重复的AppleId记录,并且Color列已拆分为两个布尔列。

但是,如果我想从第一个列表中保留另一个值,该怎么办?所以第一个表现在是这样的:

AppleId    Color     Value
-----------------------------
1          Green       Value1
1          Red         Value1
2          Red         Value2
3          Green       Value3
4          Red         Value4
4          Green       Value4

,分组表格如下:

AppleId    Green   Red     Value
-----------------------------------
1           1       1       Value1
2           0       1       Value2
3           1       0       Value3
4           1       1       Value4

这是c#列表:

var items = new List<Item>
{
    new Item {Color = "Green", Id = 1, Value = Value1},
    new Item {Color = "Red", Id = 1, Value = Value1},
    new Item {Color = "Red", Id = 2, Value = Value2},
    new Item {Color = "Green", Id = 3, Value = Value3},
    new Item {Color = "Red", Id = 4, Value = Value4},
    new Item {Color = "Green", Id = 4, Value = Value4}
};

我尝试使用此

var q = items.GroupBy(x => x.Id)
             .Select(group => new 
                     {
                         Id = group.Key, 
                         Green = group.Any(item => item.Color == "Green"), 
                         Red = group.Any(item => item.Color == "Red"),
                         Value = x.Value
                     });

以及其他一些变体,但无法使其发挥作用。

2 个答案:

答案 0 :(得分:1)

假设ColorId的函数,只是Color上的组。它不会改变组的数量和内容。

...
group x by new { id, color } into g
...

您现在可以使用color,因为它是密钥的一部分:g.Key.color

答案 1 :(得分:1)

试试这个: 我们的想法是使用id和值进行分组

var q = items
    .GroupBy(x => new { x.Id, x.Value})
    .Select(group => new 
             {
                 Id = group.Key.Id, 
                 Green = group.Any(item => item.Color == "Green"), 
                 Red = group.Any(item => item.Color == "Red"),
                 Value = group.Key.Value,
             });