簡體   English   中英

Linq查詢以獲取列表中的不同值

[英]Linq query to get the distinct values in a list

假設這是我的成員類

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查詢,以使List具有最短距離的不同/唯一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});

這應該給你你需要的東西:

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

它首先使用相同的CategoryId對項目進行分組,然后從每個組中選擇第一個(按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();

您可以使用以下代碼:

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

將列表分組為類別,然后按距離對每個分組進行排序,取第一個項目(最低距離)。 將結果投影到新的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 
            };

試試這個

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

這也有效,如果你不需要訂購的物品(很少修改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM