我有以下数据集,它存储在一个名为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
答案 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();