1

我想使用 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;
}
4

2 回答 2

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();
    }
}
于 2013-05-23T17:49:19.263 回答
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>实例可能效率低下,因此您可能需要考虑使用不可变结构。

于 2013-05-23T17:54:03.140 回答