[英]Convert nested foreach to Linq in C#
如何將此代碼片段轉換為一個Linq
? (我想刪除foreach)
var resultList = new List<Item>();
var query = dataList.GroupBy(x => new { x.Pruefdatum, x.Plakettenjahr });
foreach (var q in query)
{
Item temp = new Item();
foreach (Item item in q)
{
switch (item.Plakart)
{
case "HU":
temp.HU = item.Anzahl;
break;
case "SP":
temp.SP = item.Anzahl;
break;
}
}
temp.Pruefdatum = q.Last().Pruefdatum;
temp.Plakettenjahr = q.Last().Plakettenjahr;
resultList.Add(temp);
}
var result = resultList;
數據:
public static List<Item> dataList = new List<Item>()
{
new Item{Pruefdatum = DateTime.Parse("2019-02-13 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =6 }, //0
new Item{Pruefdatum = DateTime.Parse("2019-02-13 00:00:00"), Plakettenjahr = "21", Plakart = "SP", HU = 0, SP = 0, Anzahl =1 }, //1
new Item{Pruefdatum = DateTime.Parse("2019-02-15 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =1 }, //2
new Item{Pruefdatum = DateTime.Parse("2019-02-15 00:00:00"), Plakettenjahr = "21", Plakart = "SP", HU = 0, SP = 0, Anzahl =2 }, //3
new Item{Pruefdatum = DateTime.Parse("2019-02-18 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =3 }, //4
new Item{Pruefdatum = DateTime.Parse("2019-02-18 00:00:00"), Plakettenjahr = "21", Plakart = "SP", HU = 0, SP = 0, Anzahl =1 }, //5
new Item{Pruefdatum = DateTime.Parse("2019-02-20 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =6 }, //6
new Item{Pruefdatum = DateTime.Parse("2019-02-21 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =2 }, //7
new Item{Pruefdatum = DateTime.Parse("2019-02-22 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =8 }, //8
new Item{Pruefdatum = DateTime.Parse("2019-02-25 00:00:00"), Plakettenjahr = "20", Plakart = "HU", HU = 0, SP = 0, Anzahl =2 }, //9
new Item{Pruefdatum = DateTime.Parse("2019-02-25 00:00:00"), Plakettenjahr = "20", Plakart = "SP", HU = 0, SP = 0, Anzahl =7 }, //10
new Item{Pruefdatum = DateTime.Parse("2019-02-25 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =9 }, //11
new Item{Pruefdatum = DateTime.Parse("2019-02-28 00:00:00"), Plakettenjahr = "20", Plakart = "SP", HU = 0, SP = 0, Anzahl =1 }, //12
new Item{Pruefdatum = DateTime.Parse("2019-02-28 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 0, SP = 0, Anzahl =5 }, //13
};
結果:
public static List<Item> result = new List<Item>()
{
new Item{Pruefdatum = DateTime.Parse("2019-02-13 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 6, SP = 1}, //0
new Item{Pruefdatum = DateTime.Parse("2019-02-15 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 1, SP = 2}, //1
new Item{Pruefdatum = DateTime.Parse("2019-02-18 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 3, SP = 1}, //2
new Item{Pruefdatum = DateTime.Parse("2019-02-20 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 6, SP = 0}, //3
new Item{Pruefdatum = DateTime.Parse("2019-02-21 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 2, SP = 0}, //4
new Item{Pruefdatum = DateTime.Parse("2019-02-22 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 8, SP = 0}, //5
new Item{Pruefdatum = DateTime.Parse("2019-02-25 00:00:00"), Plakettenjahr = "20", Plakart = "HU", HU = 2, SP = 7}, //6
new Item{Pruefdatum = DateTime.Parse("2019-02-25 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 9, SP = 0}, //7
new Item{Pruefdatum = DateTime.Parse("2019-02-28 00:00:00"), Plakettenjahr = "20", Plakart = "SP", HU = 0, SP = 1}, //8
new Item{Pruefdatum = DateTime.Parse("2019-02-28 00:00:00"), Plakettenjahr = "21", Plakart = "HU", HU = 5, SP = 0} //9
};
像這樣的東西
dataList
.GroupBy(x => new { x.Pruefdatum, x.Plakettenjahr })
.Select(x => new Item()
{
Pruefdatum = x.Key.Pruefdatum,
Plakettenjahr = x.Key.Plakettenjahr,
HU = x.FirstOrDefault(y => y.Plakart == "HU")?.Anzahl ?? 0,
SP = x.FirstOrDefault(y => y.Plakart == "SP")?.Anzahl ?? 0,
});
編輯:我錯過了Plakart
字段,但也不清楚是什么決定了原始示例中的值( temp
永遠不會分配Plakart
)。 在這種情況下,我上面的列表產生與原始代碼列表完全相同的結果,盡管這與聲稱是結果的列表不匹配。
另外,我使用Key
而不是Last()
因為如果您已經按它分組,則不需要使用查詢結果中的最后一項。 這意味着第一個或最后一個或任何一個之間不會有任何變化,真的。 如果排序順序很重要,您可以隨時將Key
換回Last()
。
現在,根據結果數據集,我可以推遲確定Plakart
值的唯一規則是 if HU > 0 then HU else SP,這將導致將其添加到我的 select 子句中:
Plakart = x.Any(y => y.Plakart == "HU" && y.Anzahl > 0) ? "HU" : "SP",
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.