99

正确的语法是什么:

IList<string> names = "Tom,Scott,Bob".Split(',').ToList<string>().Reverse();

我在搞砸什么?TSource 是什么意思?

4

6 回答 6

261

问题是您正在调用List<T>.Reverse()which 返回void

你可以这样做:

List<string> names = "Tom,Scott,Bob".Split(',').ToList<string>();
names.Reverse();

或者:

IList<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>();

后者更昂贵,因为反转任意IEnumerable<T>数据涉及缓冲所有数据,然后全部产生 - 而List<T>可以“就地”完成所有反转。(这里的区别在于它调用的是Enumerable.Reverse<T>()扩展方法,而不是List<T>.Reverse()实例方法。)

更有效的是,您可以使用:

string[] namesArray = "Tom,Scott,Bob".Split(',');
List<string> namesList = new List<string>(namesArray.Length);
namesList.AddRange(namesArray);
namesList.Reverse();

这避免了创建任何大小不合适的缓冲区 - 代价是在一个可以做的地方使用四个语句......与以往一样,在实际用例中权衡可读性与性能。

于 2008-11-24T20:35:32.510 回答
12

我意识到这个问题已经很老了,但是我遇到了类似的问题,除了我的字符串中包含空格。对于那些需要知道如何用不仅仅是逗号来分隔字符串的人:

string str = "Tom, Scott, Bob";
  IList<string> names = str.Split(new string[] {","," "},
  StringSplitOptions.RemoveEmptyEntries);

StringSplitOptions 删除仅是空格字符的记录...

于 2012-07-05T07:31:27.693 回答
5
List<string> names = "Tom,Scott,Bob".Split(',').Reverse().ToList();

这个有效。

于 2008-11-24T20:37:04.330 回答
2

试试这个:

List<string> names = new List<string>("Tom,Scott,Bob".Split(','));
names.Reverse();
于 2008-11-24T20:33:48.567 回答
1

您在这里缺少的是 .Reverse() 是一个 void 方法。无法将 .Reverse() 的结果分配给变量。但是,您可以更改顺序以使用 Enumerable.Reverse() 并获得结果

var x = "Tom,Scott,Bob".Split(',').Reverse().ToList<string>()

不同之处在于 Enumerable.Reverse() 返回一个 IEnumerable<T> 而不是 void 返回

于 2008-11-24T20:37:33.237 回答
1

如果你想

  1. 使用多个分隔符
  2. 过滤任何空字符串
  3. 修剪前导/尾随空格

以下应该工作:

string str = "Tom Cruise, Scott, ,Bob | at";
IEnumerable<string> names = str
                            .Split(new char[]{',', '|'})
                            .Where(x=>x!=null && x.Trim().Length > 0)
                            .Select(x=>x.Trim());

输出

  • 汤姆
  • 巡航
  • 斯科特
  • 鲍勃

现在您显然可以按照其他人的建议颠倒顺序。

于 2017-08-21T14:06:16.613 回答