根据状态计算列表的项目

时间:2015-05-26 16:42:10

标签: c# .net winforms

我的问题很简单,但我无法在搜索中找到解决方案 好吧,我在这里有这些课程和列表:

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>();

表格可以有两种状态:UnoccupiedOccupied。我需要的是统计表格列表中的所有表格并根据状态将它们分开,但我不知道如何做到这一点。例如,我有两个状态占用的表和三个状态未占用的表。我需要输出如:You have 2 tables occupied and 3 tables unoccupied。我想我需要使用while循环,但我不知道如何分开计算。

2 个答案:

答案 0 :(得分:4)

只需使用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);
}

请注意,这只会为您提供至少包含一个表的状态,因此如果状态为none且您也需要,则可以调整以下内容。

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);
}

另外,您可能需要考虑为enum创建一个Status,如果它只是两个值中的一个。

public enum TableStatus
{
    Unoccupied,
    Occupied
}

答案 1 :(得分:3)

您可以使用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");
相关问题