列表元素集合
List elements collection
我得到了一个列表:
List<string> list = new List<string>();
list.Add("x1");
list.Add("x2");
list.Add("x3");
list.Add("x4");
.
.
.
.
list.Add("x100");
现在我需要一个 List 集合,正好包含 listofX 中的 10 个元素。
所以 List1 有 1 到 10 个来自 listofX 的元素,list2 有 11 到 20 个来自 listofX 的元素。
这可以用 Lambda 表达式或 LINQ 来完成吗
可以这样做:
var list1 = list.Take(10).ToList();
var list2 = list.Skip(10).Take(10).ToList();
var list3 = list.Skip(20).Take(10).ToList();
等等
或更一般地说:
var number = list.Count / 10;
var lists = new List<List<string>>(number);
for (int i = 0; i < number; i++)
lists.Add(list.Skip(i * 10).Take(10));
这将创建这些列表的列表。
类似于:
var lists = Enumerable
.Range(0,10)
.Select(x=>
Enumerable
.Range(x*10+1,10)
.Select(y=>"x" + y.ToString()));
如果您正在寻找一种通用方法,那么也许...
var list=Enumerable.Range(1,100).Select(y=>"x" + y.ToString());
var newlist=Enumerable.Range(0,10).Select(x=>list.Skip(x*10).Take(10));
或者最后,您可以使用这样的扩展方法:
public static IEnumerable<List<T>> InSetsOf<T>(this IEnumerable<T> source, int max)
{
var toReturn = new List<T>(max);
foreach (var item in source)
{
toReturn.Add(item);
if (toReturn.Count == max)
{
yield return toReturn;
toReturn = new List<T>(max);
}
}
if (toReturn.Any())
{
yield return toReturn;
}
}
你可以这样使用它:
var newList=list.InSetsOf(10);
您正在寻找的是一种对列表进行批处理的方法,编写一个 IEnumerable 扩展来实现它是相当直接的。
这是您可以按原样使用的代码:
public static class Extensions {
public static IEnumerable<IEnumerable<TSource>> BreakIntoChunks<TSource >(this IEnumerable<TSource> source, int size)
{
TSource[] bucket = null;
var count = 0;
foreach (var item in source)
{
if (bucket == null)
{
bucket = new TSource[size];
}
bucket[count++] = item;
// The bucket is fully buffered before it's yielded
if (count != size)
{
continue;
}
// Select is necessary so bucket contents are streamed too
yield return bucket.Select(x => x);
bucket = null;
count = 0;
}
// Return the last bucket with all remaining elements
if (bucket != null && count > 0)
{
yield return bucket.Take(count);
}
}
}
使用此方法,您可以简单地调用 list.BreakIntoChunks(10)
;//分成 10 个项目的批次
我得到了一个列表:
List<string> list = new List<string>();
list.Add("x1");
list.Add("x2");
list.Add("x3");
list.Add("x4");
.
.
.
.
list.Add("x100");
现在我需要一个 List 集合,正好包含 listofX 中的 10 个元素。
所以 List1 有 1 到 10 个来自 listofX 的元素,list2 有 11 到 20 个来自 listofX 的元素。
这可以用 Lambda 表达式或 LINQ 来完成吗
可以这样做:
var list1 = list.Take(10).ToList();
var list2 = list.Skip(10).Take(10).ToList();
var list3 = list.Skip(20).Take(10).ToList();
等等
或更一般地说:
var number = list.Count / 10;
var lists = new List<List<string>>(number);
for (int i = 0; i < number; i++)
lists.Add(list.Skip(i * 10).Take(10));
这将创建这些列表的列表。
类似于:
var lists = Enumerable
.Range(0,10)
.Select(x=>
Enumerable
.Range(x*10+1,10)
.Select(y=>"x" + y.ToString()));
如果您正在寻找一种通用方法,那么也许...
var list=Enumerable.Range(1,100).Select(y=>"x" + y.ToString());
var newlist=Enumerable.Range(0,10).Select(x=>list.Skip(x*10).Take(10));
或者最后,您可以使用这样的扩展方法:
public static IEnumerable<List<T>> InSetsOf<T>(this IEnumerable<T> source, int max)
{
var toReturn = new List<T>(max);
foreach (var item in source)
{
toReturn.Add(item);
if (toReturn.Count == max)
{
yield return toReturn;
toReturn = new List<T>(max);
}
}
if (toReturn.Any())
{
yield return toReturn;
}
}
你可以这样使用它:
var newList=list.InSetsOf(10);
您正在寻找的是一种对列表进行批处理的方法,编写一个 IEnumerable 扩展来实现它是相当直接的。
这是您可以按原样使用的代码:
public static class Extensions {
public static IEnumerable<IEnumerable<TSource>> BreakIntoChunks<TSource >(this IEnumerable<TSource> source, int size)
{
TSource[] bucket = null;
var count = 0;
foreach (var item in source)
{
if (bucket == null)
{
bucket = new TSource[size];
}
bucket[count++] = item;
// The bucket is fully buffered before it's yielded
if (count != size)
{
continue;
}
// Select is necessary so bucket contents are streamed too
yield return bucket.Select(x => x);
bucket = null;
count = 0;
}
// Return the last bucket with all remaining elements
if (bucket != null && count > 0)
{
yield return bucket.Take(count);
}
}
}
使用此方法,您可以简单地调用 list.BreakIntoChunks(10)
;//分成 10 个项目的批次