我有一个包含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;
}
答案 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)