簡體   English   中英

Group by Distinct使用Linq

[英]Group by Distinct using Linq

我想明確地在id上合並兩個或多個集合,並為每個id創建另一個屬性的集合。

我有一個對象foo

public class foo
{
    public int id { get; set; }
    public string color { get; set; }
}

我有多個List<foo> ,它們有共同的ID,但顏色不同

//list 1
id = 1, color = "red"
id = 2, color = "blue"
id = 3, color = "green"
id = 1, color = "blue"
id = 2, color = "orange"
//list 2                
id = 1, color = "black"
id = 2, color = "amber"
id = 3, color = "red"
id = 4, color = "red"
id = 2, color = "silver"

我想使用linq來生成一個新的集合,該集合將在id上進行區分,但是創建和顏色屬性列表。

id = 1, color = { "red", "blue", "black" }
id = 2, color = { "blue", "orange", "amber", "silver" }
id = 3, color = { "green", "red" }
id = 4, color = { "red" }

問:如何用linq編寫

var colours = list.GroupBy(x => x.id)
                  .Select(x => new {id = x.Key, color = x.Select(y => y.color).ToList()})
                  .ToList();

這將為您提供所需結構中名為顏色的列表。

如果您希望顏色字段是逗號分隔的字符串,請將其更改為:

var colours = list.GroupBy(x => x.id)
                  .Select(x => new {id = x.Key, color = x.Select(y => y.color).ToArray().Join(",")})
                  .ToList();

我想你想要一個Dictionary<int, List<string>>

Dictionary<int, List<string>> idColors = foos
    .GroupBy(f => f.id)
    .ToDictionary(g => g.Key, g => g.Select(f => f.color).ToList());

現在,您可以通過以下方式訪問每個id的顏色:

List<string> colors = idColors[1];
Console.WriteLine(string.Join(",", colors));
var result = List.GroupBy(g => new { g.id, g.color })
                         .Select(g => g.First())
                         .ToList();

你可以使用下面提到的代碼

var mergedList = list1.Concat(list2)
                  .GroupBy(person => person.id)
                  .Select(group => group.Aggregate(
                                     (merged, next) => merged.Merge(next)))
                  .ToList();

我認為這就是你要找的東西:

list1.Concat(list2)
    .GroupBy(x => x.id)
    .Select(x => new foo 
                   {  
                      id = x.Key, 
                      color = string.Join(",", x.Select(g => g.color)) 
                   }).ToList();

嘗試這個:

 var combinedList = list1;
 combinedList.AddRange(list2);
 var uniqueIds = combinedList.Select(p => p.id).Distinct()

 var result = new Dictionary<int, List<string>>();
 uniqueIds.ForEach(i => result.Add(i, new List<string>());
 combinedList.ForEach(i => result[i.id].Add(i.color);

我沒有對此進行過測試,但我認為它應該沒問題......可能是一種更好的方法,但這應該讓你暫時工作!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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