簡體   English   中英

根據狀態計數列表中的項目

[英]Count the items of a List according to their status

我的問題很簡單,但是在搜索中找不到解決方案。
好吧,我這里有這些類和列表:

public class Table
{
    public string TableName { get; set; }
    public string Status { get; set; }
    public List<Request> Requests { get; set; }
}

public class Request
{
    public string ProductName { get; set; }
    public double ProductPrice { get; set; }
    public int Quantity { get; set; }
}

public List<Table> Tables = new List<Table>();

這些表可以具有兩種狀態: Unoccupied和已Occupied 我需要計算表列表中的所有表並根據狀態將它們分開,但是我不知道該怎么做。 例如,我有兩個表,它們的狀態為已占用,三個表,它們的狀態為未占用。 我需要這樣的輸出: You have 2 tables occupied and 3 tables unoccupied 我想我需要使用while循環,但是我不知道如何分開計算。

只需使用GroupBy

var results = Tables.GroupBy(t => t.Status)
    .Select(g => new
        {
            Status = g.Key, 
            Count = g.Count()
         });

foreach(var item in results)
{
    Console.WriteLine("You have {0} tables of status {1}", item.Count, item.Status);
}

請注意,這只會為您提供至少包含一個表的狀態,因此,如果一個狀態不包含任何表,並且您也需要它,則可以調整以下內容。

var results = Tables.GroupBy(t => t.Status)
    .ToDictionary(g => g.Key, g => g.Count());

foreach(var status in new[] {"Unoccupied", "Occupied"})
{
    int count;
    results.TryGetValue(status, out count);
    Console.WriteLine("You have {0} tables of status {1}", count, status);
}

另外,如果Status應該僅是兩個值之一,則可能要考慮為其創建一個enum

public enum TableStatus
{
    Unoccupied,
    Occupied
}

您可以像這樣使用LINQ:

List<Table> UnoccupiedTables = Tables.Where(r=> r.Status == "Unoccupied")
                                     .ToList();

List<Table> OccupiedTables = Tables.Where(r=> r.Status == "Occupied")
                                     .ToList();

如果要進行不區分大小寫的比較,則可以替換為String.Equals

String.Equals(r.Status, "Occupied", StringComparison.InvariantCultureIgnoreCase)

我錯過了增加計數的部分。 您可以使用另一個答案中提到的GroupBy ,也可以為每個項目計數,例如:

int CountOfUnoccupiedTables = Tables.Count(r=> r.Status == "Unoccupied");

暫無
暫無

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

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