当存在类似于以下的对象时,如何使用LINQ选择distinct:
public class foo
{
public int id { get; set; }
public string lang { get; set; }
public string name { get; set; }
}
列表可能是:
id = 1, lang = "en", name="test1"
id = 1, lang = "fr", name="test2"
id = 1, lang = "de", name="test3"
id = 2, lang = "en", name="test4"
id = 2, lang = "fr", name="test5"
id = 3, lang = "en", name="test6"
id = 3, lang = "fr", name="test7"
id = 4, lang = "en", name="test8"
id = 5, lang = "de", name="test9"
我想运行LINQ以便它返回不同的id值,但是应该根据lang过滤不同的id值 例如" fr",应检索以下结果:
id = 1, lang = "fr", name="test2"
id = 2, lang = "fr", name="test5"
id = 3, lang = "fr", name="test7"
id = 4, lang = "en", name="test8"
id = 5, lang = "de", name="test9"
所有LINQ专家,我理想地使用lambda寻找查询,这将是一个很大的帮助。提前谢谢。
答案 0 :(得分:0)
按id
对项目进行分组,并从每个组中取出按lang != "fr"
排序的第一项。这会使“fr”项浮动到每个组的顶部(false
之前排序true
):
list.GroupBy(f => f.id)
.Select(g => g.OrderBy(f => f.lang != "fr").FirstOrDefault())
答案 1 :(得分:0)
怎么样:
foos.GroupBy(el => el.id)
.Select(gr => new
{
foo = gr.Any(el => el.lang == "fr") ? gr.FirstOrDefault(el => el.lang == "fr") : gr.FirstOrDefault()
});