列出元素集合

时间:2015-04-10 14:57:26

标签: c# linq list collections lambda

我有一份清单:

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具有listofX中的1到10个元素,list2具有来自listofX的11到20个元素。

可以使用Lambda表达式或LINQ

来完成

3 个答案:

答案 0 :(得分:3)

可以这样做:

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));

这将创建这些列表的列表。

答案 1 :(得分:1)

类似的东西:

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);

答案 2 :(得分:0)

您正在寻找的是一种批量列表的方法,编写一个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个项目批次