我想将列表拆分为使用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;
}
答案 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>
实例可能效率低下,因此您可能需要考虑使用不可变结构。