使用LINQ选择distinct,但在另一列上不同

时间:2016-12-19 18:17:11

标签: linq c#-4.0

当存在类似于以下的对象时,如何使用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寻找查询,这将是一个很大的帮助。提前谢谢。

2 个答案:

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