[英]Linq query to get the distinct values in a list
Suppose this is my member class 假设这是我的成员类
class Member
{
public string CategoryId { get; set; }
public string MemberName { get; set; }
public int Distance { get; set; }
}
And, this is list. 而且,这是列表。
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});
Can anyone please suggest the logic/ linq query to get the List having distinct/unique categoryID with Shortest distance. 任何人都可以建议逻辑/ linq查询,以使List具有最短距离的不同/唯一categoryID。
The output
should be : 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});
This should give you what you need: 这应该给你你需要的东西:
var grouped = list.GroupBy(item => item.CategoryId);
var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());
It first groups the items with the same CategoryId
, then selects the first from each group (ordered by Distance
). 它首先使用相同的
CategoryId
对项目进行分组,然后从每个组中选择第一个(按Distance
排序)。
This is similar to those above, however it is technically a one liner for those interested.... 这类似于上面的那些,但从技术上来说,对于那些感兴趣的人来说,它是一个衬垫。
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();
You can use the following code: 您可以使用以下代码:
List<Member> sourceList = new List<Member>();
IEnumerable<Member> result =
(sourceList as IEnumerable<Member>)
.Distinct()
.OrderBy(value => value.CategoryId);
Group the list into categories, then order each grouping by distance, taking the first item (the lowest distance). 将列表分组为类别,然后按距离对每个分组进行排序,取第一个项目(最低距离)。 Project the results into a new
Member
collection. 将结果投影到新的
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
};
try this 试试这个
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);
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());
This also works, if you do not require items ordered by (little modified Kjartan's answer ) 这也有效,如果你不需要订购的物品(很少修改Kjartan的答案 )
var grouped = list.GroupBy(item => item.CategoryId).ToList();
var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.