【发布时间】:2013-07-18 02:12:15
【问题描述】:
在 C# 中,调用 .Split 方法会根据某个字符或字符串将字符串拆分为字符串数组。
列表或数组是否有等效的方法?
例如:
var foo = new List<int>() { 1, 2, 3, 0, 4, 5, 0, 6 };
var output = Split(foo, 0);
// produces { { 1, 2, 3 }, { 4, 5 }, { 6 } }
这就是我目前所拥有的——是否有更简洁或更雄辩的方式来完成相同的任务?
IEnumerable<IEnumerable<T>> Split<T>(IEnumerable<T> list, T divider)
{
var output = new List<List<T>>();
var temp = new List<T>();
foreach ( var item in list )
{
if (item.Equals(divider))
{
output.Add(temp);
temp = new List<T>();
}
else
{
temp.Add(item);
}
}
output.Add(temp);
return output;
}
编辑:
我突然想到,我的版本只会按单个元素拆分列表,而 string.Split 可以使用单个字符或任意字符串进行拆分。
为了完整起见,最好的实现方式是什么?
【问题讨论】:
-
你也许可以用 IndexOf 做点什么,虽然我不确定它如何比较一般的平等......
-
在您的编辑中 - 虽然使用单个分隔符很简单,什么是“好/更好”的代码,但匹配序列并非如此:您需要在匹配期间正确处理未命中(
aabbaba在bab上拆分需要某种形式的重新访问,首先要返回b以在多种方法上进行不同的权衡。还有许多不同的字符串匹配算法(这正是您在编辑中想要的),它们针对不同的标准进行了优化。所以编辑并不是真正可以回答的(在“最好”的意义上)。 -
Group by element in Linq 的可能重复项