如何将列表拆分为按元素分组的子列表

时间:2016-06-17 14:24:09

标签: c# linq lambda

这是与This previus question类似的问题,但在我的情况下,我不知道我必须在每个列表中添加多少项目。

我有一个"项目"具有此属性

.gitignore

此列表包含以下值:

List of Values

如何将此列表拆分为ItemA和ItemB的新public class Items{ public Id { get; set;} public String ItemA { get; set;} public String ItemB { get; set;} public String ItemC { get; set;} public String ItemD { get; set;} public String ItemE { get; set;} } // And a List of Items List<Items> .... 分组? 在此示例中,预期结果应为:

List<List<Items>>

2 个答案:

答案 0 :(得分:2)

只需使用GroupBy并创建一个包含您要分组的属性的匿名类。

var result = yourList.GroupBy(x => new { x.ItemA, x.ItemB })
                     .Select(grp => grp.ToList())
                     .ToList();

答案 1 :(得分:1)

使用LINQ轻松分组

您可以通过提供匿名对象来分组LINQ的内置Enumerable.GroupBy()方法:

// This will group your rows using the values in ItemA and ItemB
var grouped = input.GroupBy(i => new { i.ItemA, i.ItemB })
                   .ToList();

这会将您现有的集合分解为您要查找的三个不同的分组,每个分组都包含一个IEnumerable<Items>,其中包含该组中的每个分组。

如果你需要整数......

如果您想要实际检索字符串的整数值(因为所有属性当前都是字符串),您可以考虑显式解析它们,或者编写一个方法,将整数数组返回预期值: / p>

public class Items
{
    // Omitted for brevity

    public int[] ToIntegerArray()
    {
        return new int[]{ 
           Int32.Parse(Id), 
           Int32.Parse(ItemA), 
           Int32.Parse(ItemB), 
           Int32.Parse(ItemC), 
           Int32.Parse(ItemD), 
           Int32.Parse(ItemE) 
        };  
    }
} 

这样您就可以将代码更改为仅输出实际值而不是Items个对象的集合:

// This will group your rows using the values in ItemA and ItemB and map
// each of the inner groupings to an array of integer values
var groupedItems = items.GroupBy(i => new { i.ItemA, i.ItemB }) 
                        .Select(g => g.Select(ig => ig.ToIntegerArray()))
                        .ToList();

示例

enter image description here

你可以see a complete working example of this here