我有這門課(為了便于閱讀而簡化了)
public class Customer
{
public string Id {get;set;}
public Email[] Emails {get;set;}
}
從外部系統我得到一個串列,Customers其中可以包含相同(ID)的多行 Customer
原始輸入 JSON
[
{id: a1, emails:[a,b,c]},
{id: a1, emails:[d]},
{id: b3, emails:[e,f]},
{id: k77, emails:[z,a]}
]
獲取客戶的c#代碼
List<Customer> dataInput = CallToExternalService(...);
我想生成一個唯一的Customersvia LINQ串列,其中包含所有客戶電子郵件的合并串列。我知道如何獲取唯一客戶串列
dataInput.GroupBy(x => x.id).Select(x => x.First()).ToList();
但是我正在為如何將每個客戶的電子郵件串列合并為一個而苦苦掙扎。性能也是一個重要因素,因為資料將包含 10k 項并且需要每小時運行一次。
我嘗試了很多,Select并且SelectMany是很好的候選人,但我無法理解如何合并串列,更不用說將這個合并的串列帶回x.First()專案。
元代碼:
dataInput
.GroupBy(x => x.id)
.ForEachGroup(y => group.First().Emails = MergeLists(y.Emails;)
.Select(z => z.First()),ToList();
預期的最終結果 C# List<>
id: a1, emails:[a,b,c,d]
id: b3, emails:[e,f]
id: k77, emails:[z,a]
uj5u.com熱心網友回復:
對“合并”的含義做出一些假設,但這看起來正確嗎?
dataInput
.GroupBy(x => x.Id)
.Select(g=> new Customer
{
Id = g.Key,
Emails = g.SelectMany(c => c.Emails).ToArray()
})
.ToList();
uj5u.com熱心網友回復:
如果您確定所有其他屬性都相同,您可以First在初始嘗試中使用like 并像這樣修改@StriplingWarrior 的答案:
dataInput
.GroupBy(x => x.Id)
.Select(g =>
{
var customer = g.First();
customer.Emails = g.SelectMany(c => c.Emails).ToArray();
return customer;
})
.ToList();
uj5u.com熱心網友回復:
如果您打算使用 Jack 的方法,我會建議使用更強大的方法。
var intermediate =
(
from g in dataInput.GroupBy(c => c.Id)
from c in g.Take(1)
select new
{
customer = c,
emails = g.SelectMany(d => d.Emails).ToArray()
}
)
.ToArray();
foreach (var x in intermediate)
{
x.customer.Emails = x.emails;
};
Customer[] ouput =
intermediate
.Select(x => x.customer)
.ToArray();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/344917.html
