关于c#:我如何使用Linq获取按属性过滤的不同结果

How can I use Linq to get distinct results filtered by property

本问题已经有最佳答案,请猛点这里访问。

对于此类:

1
2
3
4
5
6
public class Tool
    {
        public int Id { get; set; }
        public int Number { get; set; }
        public string Source { get; set; }
    }

以及类似的工具列表:

1
2
3
4
5
6
7
8
9
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按编号获取不同工具的列表,如果两个工具的编号相同,请选择源代码为"M1"的工具,即结果列表将包含:

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

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

你需要把你的Tools按号码分组,然后得到它们中的First()

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


尝试按数字分组并获取第一个元素,

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

WORKING FIDDLE