我需要根据特定的属性将大量元素分组。 在C#中是否可以在对象列表中使用“ where”子句进行foreach或有更好的方法? 例如,我有5000条记录和3个将它们分开的组。
Foreach list.item where item.group = group1{
do action one for every record from group1
}
,依此类推... ps .:我现在已经在代码点上有了记录,所以我认为Linq不会有所帮助。
答案 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 // })
});