LINQ:Group By,并检索公共属性

时间:2017-04-26 19:31:29

标签: c# linq

我有以下数据集,它存储在一个名为list1的变量中。

countrypk | countryname | statepk | statename
---------------------------------------------
1           USA           1         New York
1           USA           2         California
2           Canada        3         Manitoba

我希望能够按countrypk进行分组,并检索国家/地区名称。

我有以下LINQ实现了这种效果,但是想知道在LINQ中是否有更好或更直接的方法。

var finalList = list1
    .GroupBy(item => item.countrypk)
    .Where(item => item.Count() > 0)
    .Select(item => item.First())

所需的输出是:

countrypk | countryname 
---------------------------------------------
1           USA                  
2           Canada        

4 个答案:

答案 0 :(得分:2)

不需要添加Where。如果您有一个组,则其中至少包含一个项目。你可以这样做:

list1.GroupBy(item => item.countrypk)
     .Select(item => new { item.Key, item.First().countryname} );

或使用GroupBy的不同重载:

list1.GroupBy(item => item.countrypk, 
              selector => new { selector.countrypk, selector.countryname} )
     .Select(group => group.First())

答案 1 :(得分:0)

如果按countrypk分组,则结果集中不会有重复项。您想要的结果集中包含重复的countrypk值(1)。要获得所需的结果集,请执行以下操作:

var finalList = list1.Select(s => new { s.countrypk, s.countryname });

编辑:没关系上面这部分,OP编辑了这个问题。

I want to be able to group by countrypk, and retrieve the country name您要求的内容与结果集显示的内容不同。如果您想使用list1获取countrypk到国家/地区名称的地图,可以采用以下方法:

var finalList = list1
    .GroupBy(g => new { g.countrypk, g.countryname })
    .ToDictionary(k => k.Key.countrypk, v => v.Key.countryname);

请注意,您不需要GroupBy来执行此操作。这是另一个解决方案:

var finalList = list1
    .Select(s => new { s.countrypk, s.countryname })
    .Distinct()
    .ToDictionary(k => k.countrypk, v => v.countryname);

在任何一种情况下,要获取id 1的国家/地区名称,请执行以下操作:

var countryName = finalList[1];

答案 2 :(得分:0)

尝试以下

var finalList = list1
    .GroupBy(item => item.countrypk)
    .Select(g => new { countrypk = g.Key, countryname = g.First().countryname });

应该提供所需的输出

答案 3 :(得分:0)

基本上你想删除countrypk的重复项并只选择前两列?使用此扩展程序:

public static IEnumerable<TSource> DistinctBy<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
    {
        HashSet<TResult> set = new HashSet<TResult>();

        foreach(var item in source)
        {
            var selectedValue = selector(item);

            if (set.Add(selectedValue))
                yield return item;
        }
    }

然后

var finalList = list1
    .DistinctBy(item => item.countrypk)
    .Select(item=> new {item.countrypk, item.countryname })
    .ToList();