簡體   English   中英

在 C# 中將嵌套的 foreach 轉換為 Linq

[英]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.

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