使用linq从列表中选择列表

时间:2014-04-02 14:45:13

标签: c# linq list

我有一个包含x项的列表。我希望得到一个结果,根据数字而不是属性对此列表进行分组。

例如。

我有8个项目的清单。我想把它们分组3。 我想获得一个包含三个列表的List,其中前两个列表包含每个三个项目,最后一个列表包含剩余的两个列表。

我想要一个比这更优雅的解决方案:

private static List<List<string>> GroupBy(List<string> pages, int groupSize)
{
    var result = new List<List<TrimlinePage>>();
    while (!(result.Count != 0 && result.Last().Count % 3 > 0))
    {
        int skip = result.Count*groupSize;
        var group = pages.Skip(skip).Take(groupSize).ToList();
        result.Add(group);
    }
    return result;
}

5 个答案:

答案 0 :(得分:2)

您可以使用整数divison技巧:

List<List<string>> lists = pages
    .Select((str, index) => new { str, index }) 
    .GroupBy(x => x.index / groupSize)
    .Select(g => g.Select(x => x.str).ToList())
    .ToList();

示例:

int groupSize = 3;
var pages = new List<string> { "A", "B", "C", "D", "E", "F", "G" };
List<List<string>> lists = pages
    .Select((str, index) => new { str, index })
    .GroupBy(x => x.index / groupSize)
    .Select(g => g.Select(x => x.str).ToList())
    .ToList();

结果:

foreach(var list in lists)
    Console.WriteLine(string.Join(",", list));

输出:

A,B,C
D,E,F
G

因此,此方法将为您提供具有指定最大尺寸的列表,在本例中为3.如果您想要确保始终获得三个列表,则需要使用%而不是/

List<List<string>> lists = pages
    .Select((str, index) => new { str, index }) 
    .GroupBy(x => x.index % groupSize)
    .Select(g => g.Select(x => x.str).ToList())
    .ToList();

答案 1 :(得分:0)

试试这个:

var list = Enumerable.Range(1,100);
var query = list
              .Select((x, i) => new {x, i})
              .GroupBy(v => v.i / 3).Select(g => g.Select(v =>v.x.ToList()))
              .ToList();

答案 2 :(得分:0)

这是一个使用副作用的简单解决方案(通常不鼓励):

private static List<List<string>> GroupBy(List<string> pages, int groupSize)
{
    var i = 0;
    return pages.GroupBy(p => i++ / 3, (k, g) => g.ToList()).ToList();
}

或者,如果您想避免依赖副作用,可以使用:

private static List<List<string>> GroupBy(List<string> pages, int groupSize)
{
    return pages.Select(p => new { p, i })
                .GroupBy(x => x.i / 3)
                .Select(g => g.Select(x => x.p).ToList())
                .ToList();
}

答案 3 :(得分:0)

LINQ不是最好的解决方案。通常,好的旧索引更具可读性和效率。

private static List<List<T>> GroupBy(List<T> pages, int groupSize)
{
    var result = new List<List<T>>();
    List<T> l;
    for (int i=0; i < pages.Count; i++)
    {
        if (i%groupSize == 0)
        {
            l = new List<T>();
            result.Add(l);
        }
        l.Add(pages[i]);
    }
    return result;
}

答案 4 :(得分:0)

您还可以查看包含morelinq方法的Partition

可以通过NuGet获得。