如何使用LINQ将列表拆分为所有案例子列表?

时间:2013-05-23 17:44:40

标签: c# linq

我想将列表拆分为使用LINQ的所有SubLists案例? 例如:

列表包含:{"a", "b", "c"}

我想列出结果列表:{"a", "ab", "abc"}

public List<List<Alphabet>> ListofLists (Stack<String> Pile)
{
    var listoflists = new List<List<Alphabet>>();
    var list = new List<Alphabet>();

    foreach (var temp in from value in Pile where value != "#" select new Alphabet(value))
    {
        list.Add(temp);

        listoflists.Add(list);
    }


    return listoflists;
}

2 个答案:

答案 0 :(得分:2)

此方法允许您执行此操作。

IEnumerable<IEnumerable<T>> SublistSplit<T>(this IEnumerable<T> source)
{
    if (source == null) return null;

    var list = source.ToArray();
    for (int i = 0; i < list.Length; i++)
    {
        yield return new ArraySegment<T>(list, 0, i);
    }
}

如果是字符串:

IEnumerable<string> SublistSplit<T>(this IEnumerable<string> source)
{
    if (source == null) return null;

    var sb = new StringBuilder();
    foreach (var x in source)
    {
        sb.Append(x);
        yield return sb.ToString();
    }
}

答案 1 :(得分:2)

如果要产生累积的中间值,可以定义自己的扩展方法:

public IEnumerable<TAcc> Scan<T, TAcc>(this IEnumerable<T> seq, TAcc init, Func<T, TAcc, TAcc> acc)
{
    TAcc current = init;
    foreach(T item in seq)
    {
        current = acc(item, current);
        yield return current;
    }
}

然后你的例子是:

var strings = new[] {"a", "b", "c"}.Scan("", (str, acc) => str + acc);

对于列表,您每次都必须复制它们:

List<Alphabet> input = //
List<List<Alphabet>> output = input.Scan(new List<Alphabet>(), (a, acc) => new List<Alphabet(acc) { a }).ToList();

请注意,复制中间List<T>实例可能效率低下,因此您可能需要考虑使用不可变结构。