【问题标题】:Linq to trim each word in IList<string[]>Linq 修剪 IList<string[]> 中的每个单词
【发布时间】:2016-11-21 08:37:26
【问题描述】:

我知道这个问题的标题不准确,肯定有更好的,但是我的英语不是很好。而且这个问题也可能是重复的。 现在任务是读取csv文件,格式如下:

col1, col2
int1, string1
int2, string2

现在想用Linq解析成IList&lt;string[]&gt;,方便以后使用(每一行转换成一个对象,各种类型的csv文件很多)。代码如下:

IList<string[]> v = File.ReadAllLines("test.csv").Select(
l => l.Split(new char[] { ',', ',' }, StringSplitOptions.RemoveEmptyEntries)
//if add this, cannot compile
//.Select(w => w.Trim())
)
.Skip(1).ToList();

请在注释行提供帮助。我想修剪每个单词,以便以后可以将它们转换为整数。但这不会编译(我知道原因可能是 Linq 将 w 视为 IEnumable&lt;Char&gt;,但是我如何仅在一个 Linq 语句中实现我的目标

【问题讨论】:

  • 顺便问一下,您是完全关心行,还是只想要一个带有单词的数组?
  • 一行为一物,行字不可混淆。

标签: c# string linq csv ienumerable


【解决方案1】:

在您最初的尝试中,您遇到了一个错误

l.Split(new char[] { ',', ',' } ...

因为', ' 不能是单个字符。你想要这样的东西

IList<string[]> v = File
  .ReadLines("test.csv")
  .Skip(1) // skip titles
  .Select(line => line.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
  .Select(items => items
    .Select(item => item.Trim()) // trim each item 
    .ToArray())
  .ToList();

编辑:Evk 建议的较短版本(见下面他的评论)

IList<string[]> v = File
  .ReadLines("test.csv")
  .Skip(1) // skip titles
  .Select(line => line
    .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
    .Select(item => item.Trim()) // trim each item 
    .ToArray())
  .ToList();

【讨论】:

  • 你可以在Split(Split().Select().ToArray())之后立即修剪它们,将保存一个Select语句。
  • @Evk:你是对的;我知道了。但是由于问题是关于 Trim 并且在初始 Split 中有一个 error 我选择了 two Select 以便没有 Linq 太复杂了
  • @DmitryBychenko thx,我正在尝试您的解决方案。但想知道你怎么说“不要太复杂”,你的意思是有一个**复杂的方式**(只是好奇)?
  • @Lei Yang:Evk 建议将Select 合并为一个(见我的编辑)。最初我没有这样做,因为我决定逐步展示 Linq。
  • 您的解决方案有效!我今天学习了一些新东西,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
相关资源
最近更新 更多