从对象列表中查找每个组项目

时间:2019-03-21 00:10:48

标签: c# list foreach

我需要根据特定的属性将大量元素分组。 在C#中是否可以在对象列表中使用“ where”子句进行foreach或有更好的方法? 例如,我有5000条记录和3个将它们分开的组。

Foreach list.item where item.group = group1{
do action one for every record from group1
}

,依此类推... ps .:我现在已经在代码点上有了记录,所以我认为Linq不会有所帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用ToLookup根据属性将较大的列表分为较小的列表。 ToLookup方法将产生一个列表字典,其中的键是您将它们分隔的属性值,并且列表包含所有匹配的元素。

例如,如果您的对象具有CategoryID,则可以将其分成这样的列表字典:

var smallLists = bigList.ToLookup( item => item.CategoryID, item => item );

然后您可以像这样迭代它们:

foreach (var bucket in smallLists)
{
    Console.WriteLine("Bucket:");
    foreach (var item in bucket)
    {
        Console.WriteLine("Item {0} with category {1}", item.Name, item.CategoryID);
    }
}

请参见DotNetFiddle上的有效示例。

答案 1 :(得分:0)

此基本模板应满足您的需求。您还可以使用字典将组映射到。

using System.Linq; 

class Program
{
    class Item
    {
        public int Key { get; set; }
        public string Name { get; set; }
    }

    static void Main(string[] args)
    {
        var actions = new Dictionary<int, Action<Item>> {
            { 1, Action1 },
            { 2, Action2 },
            { 3, Action3 }
        };

        var items = new List<Item>();

        foreach (var group in items.GroupBy(x => x.Key))
        {
            var action = actions[group.Key];
            foreach (var item in group)
            {
                action(item);
            }
        }
    }

    static void Action1(Item item)
    {

    }

    static void Action2(Item item)
    {

    }

    static void Action3(Item item)
    {

    }
}

答案 2 :(得分:0)

我认为您要做的是按组对列表项进行分组,然后用每个组及其项创建另一个列表。

在这种情况下,您可以执行以下操作:

var grouped = items/*.Where(c => c.group == //desired group if want's to filter//)*/
     .GroupBy(c => c.group);
var results = grouped.Select(c => new {
     Group = c.Key.group,
     Items = c.Select(c => new { c.PropertyOfItem1, c.PropertyOfItem2, // etc // })
});