C#语法-按逗号将字符串拆分为数组,转换为通用列表,并反转顺序


92

正确的语法是什么:

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

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

Answers:


251

问题是您正在呼叫List<T>.Reverse()返回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();

这样可以避免创建任何大小不适当的缓冲区-付出的代价是采用四个将要执行的语句...像往常一样,在实际用例中权衡可读性和性能。


25
飞碟是野兽!

2
精心阐述,我真的很感激!
Gaurav Aroraa 2011年

11

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

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

StringSplitOptions删除仅是空格的记录。


如果您使用的是“汤姆·克鲁斯”(Tom Cruise),而汤姆
燃烧


1

试试这个:

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

我收到错误-无法将类型'void'隐式转换为'System.Collections.Generic.List <string>
BuddyJoe

1

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

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

区别在于Enumerable.Reverse()返回IEnumerable <T>而不是void return


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

输出量

  • 汤姆
  • 巡航
  • 史考特
  • 鲍勃

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.