如何使用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;
}
这个方法将允许您这样做。
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>
实例可能效率低下,因此您可能需要考虑使用不可变结构。