C# Linq查询以获取列表中的不同值

C# Linq查询以获取列表中的不同值,c#,linq,c#-4.0,C#,Linq,C# 4.0,假设这是我的成员类 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" D

假设这是我的成员类

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});

这应满足您的需求:

var grouped = list.GroupBy(item => item.CategoryId);
var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());
它首先使用相同的
类别ID对项目进行分组,然后从每组中选择第一个(按
距离排序)


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

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

您可以使用以下代码:

List<Member> sourceList = new List<Member>();
IEnumerable<Member> result = 
    (sourceList as IEnumerable<Member>)
    .Distinct()
    .OrderBy(value => value.CategoryId);
List sourceList=newlist();
IEnumerable结果=
(源列表为IEnumerable)
.Distinct()
.OrderBy(value=>value.CategoryId);
试试这个

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);
var-differentids=list.Distinct(item=>item.CategoryId.ToList();
var newList=新列表();
foreach(区分中的变量id){
添加(list.Where(item=>item.CategoryId==id).Min(item=>item.Distance))
}
newList.OrderBy(item=>item.CategoryId);
班级成员{
公共字符串CategoryId{get;set;}
公共字符串MemberName{get;set;}
公共整数距离{get;set;}
}
var list=新列表();
添加(新成员{CategoryId=“01”,MemberName=“andy”,距离=3});
添加(新成员{CategoryId=“02”,MemberName=“john”,距离=5});
添加(新成员{CategoryId=“01”,MemberName=“mathew”,距离=7});
添加(新成员{CategoryId=“03”,MemberName=“bakara”,距离=2});
var query=list.GroupBy(member=>member.CategoryId);

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

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 
            };

这与上述内容类似,但从技术上讲,这是一条针对感兴趣的人的单行线

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订购时,它工作正常,感谢您的努力。
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 
            };
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();
var grouped = list.GroupBy(item => item.CategoryId).ToList();
var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());