【问题标题】:Linq query to get the distinct values in a listLinq 查询以获取列表中的不同值
【发布时间】:2014-01-02 13:18:08
【问题描述】:

假设这是我的成员类

class Member 
{
    public string CategoryId { get; set; }
    public string MemberName { get; set; }
    public int Distance { get; set; }
}

而且,这是列表。

var list = new List<Member>();
list.Add(new { CategoryId = "01", MemberName="andy" Distance=3});
list.Add(new { CategoryId = "02", MemberName="john" Distance=5});
list.Add(new { CategoryId = "01", MemberName="mathew" Distance=7});
list.Add(new { CategoryId = "03", MemberName="bakara" Distance=2});

任何人都可以建议逻辑/ linq 查询以获取具有不同/唯一 categoryID 和最短距离的列表。

output 应该是:

list.Add(new { CategoryId = "01", MemberName="andy" Distance=3});
list.Add(new { CategoryId = "02", MemberName="john" Distance=5});
list.Add(new { CategoryId = "03", MemberName="bakara" Distance=2});

【问题讨论】:

    标签: c# linq c#-4.0


    【解决方案1】:

    这应该满足您的需求:

    var grouped = list.GroupBy(item => item.CategoryId);
    var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());
    

    它首先将具有相同CategoryId 的项目分组,然后从每个组中选择第一个(按Distance 排序)。


    更新: 如果您愿意,您也可以将所有这些链接在一起:

    var shortest = list.GroupBy(item => item.CategoryId)
                       .Select(grp => grp.OrderBy(item => item.Distance)
                       .First());
    

    【讨论】:

      【解决方案2】:

      这与上面的类似,但从技术上讲,对于那些感兴趣的人来说,它是一个单一的衬里......

      var queryResult= (from l in list
                        select new Member()
                       { 
                          CategoryId = l.CategoryId , 
                          MemberName = l.MemberName 
                          Distance = l.Distance
                       }).GroupBy(x=>x.CatagoryId).Select(z=>z.OrderBy(i=>i.Distance).First()).ToList();
      

      【讨论】:

      • 非常感谢,发布这个,经过数小时的研究,它帮助了我,我只是想在 EF 中显示所有重复的记录,但是当我按 ID 订购时,它可以工作,感谢你的努力。
      【解决方案3】:

      将列表按类别分组,然后按距离对每个分组进行排序,取第一项(最小距离)。将结果投影到新的Member 集合中。

      var query = from member in list 
                  group member by member.CategoryId into memberGrouping
                  let groupedMember = memberGrouping.OrderBy (mg => mg.Distance).First() 
                  select new Member()
                  { 
                    CategoryId = memberGrouping.Key, 
                    MemberName = groupedMember.MemberName, 
                    Distance = groupedMember.Distance 
                  };
      

      【讨论】:

        【解决方案4】:

        您可以使用以下代码:

        List<Member> sourceList = new List<Member>();
        IEnumerable<Member> result = 
            (sourceList as IEnumerable<Member>)
            .Distinct()
            .OrderBy(value => value.CategoryId);
        

        【讨论】:

          【解决方案5】:

          试试这个

          var distinctIds = list.Distinct(item => item.CategoryId).ToList();
          var newList = new List<Member>();
          foreach(var id in distinctIds){
                newList.Add(list.Where(item => item.CategoryId == id).Min(item => item.Distance))
          }
          newList.OrderBy(item => item.CategoryId);
          

          【讨论】:

            【解决方案6】:
            class Member {
                public string CategoryId {get; set;}
                public string MemberName{get; set;}
                public int Distance{get; set;}
            }
            
            var list = new List<Member>();
            list.Add(new Member{ CategoryId = "01", MemberName="andy", Distance=3});
            list.Add(new Member{ CategoryId = "02", MemberName="john", Distance=5});
            list.Add(new Member{ CategoryId = "01", MemberName="mathew", Distance=7});
            list.Add(new Member{ CategoryId = "03", MemberName="bakara", Distance=2});
            
            var query = list.GroupBy(member => member.CategoryId).Select(x=>x.OrderBy(y=>y.Distance).First());
            

            【讨论】:

              【解决方案7】:

              如果您不需要由(小修改Kjartan's answer)订购的物品,这也可以使用

              var grouped = list.GroupBy(item => item.CategoryId).ToList();
              var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());
              

              【讨论】:

                猜你喜欢
                • 2022-10-08
                • 1970-01-01
                • 1970-01-01
                • 2023-03-09
                • 1970-01-01
                • 1970-01-01
                • 2014-01-08
                • 2013-01-09
                • 1970-01-01
                相关资源
                最近更新 更多