如何使用Linq获取按属性过滤的不同结果

时间:2018-01-10 19:11:50

标签: c# linq

鉴于此课程:

public class Tool
    {
        public int Id { get; set; }
        public int Number { get; set; }
        public string Source { get; set; }
    }

这样的工具列表:

var tools = new List<Tool>()
            {
                new Tool {Id=444, Number=121, Source="Master"},
                new Tool {Id=777, Number=121, Source="M1"},
                new Tool {Id=333, Number=51, Source="Master"},
                new Tool {Id=555, Number=61, Source="Master"},
                new Tool {Id=848, Number=51, Source="M1"}
                //Many more
            };

我如何使用Linq获取不同工具的数量列表,如果2个工具具有相同的数字,则选择其来源为&#34; M1&#34;,结果列表将包含:

Tool {Id=777, Number=121, Source="M1"}
Tool {Id=848, Number=51, Source="M1"}
Tool {Id=555, Number=61, Source="Master"}

3 个答案:

答案 0 :(得分:2)

尝试按编号分组并获取其中的第一个元素

List<Tool> distinctTool = tools.GroupBy(p => p.Number)
                               .Select(f => f.OrderByDescending(q => q.Source == "M1").First())
                               .ToList();

<强> WORKING FIDDLE

答案 1 :(得分:2)

您需要按照号码对Tools进行分组,然后获取First()个号码

List<Tool> distinctTool = tools
  .GroupBy(p => p.Number)
  .Select(g => g.OrderByDescending(q => q.Source == "M1").First())      
  .ToList();

答案 2 :(得分:2)

List<Tool> distinctTool = tools
  .GroupBy(p => p.Number)
  .Select(g => g.OrderByDescending(q => q.Source == "M1").First())
  .ToList();