如何使用LINQ将列表拆分为所有case子列表

本文关键字:列表 case 拆分 何使用 LINQ | 更新日期: 2023-09-27 18:15:16

我想将列表拆分为使用LINQ的所有子列表。例如:

列表包含:{"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;
}

如何使用LINQ将列表拆分为所有case子列表

这个方法将允许您这样做。

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

如果您想生成一个累加的中间值,您可以定义您自己的扩展方法:

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>实例可能效率低下,因此您可能需要考虑使用不可变结构。