2010-09-23 59 views
14

考虑这个问题:IEnumerable的<string>串

string test = ""; 
somestring.ToList().Take(50).Select(
    delegate(char x) 
    { 
     test += x; 
     return x; 
    } 
); 

现在为什么考后是空的?我不在乎实际上我知道它的IEnumerable的回报。

任何方式,如果这一切似乎一团糟那么我怎么能IEnumerable<char>转换为字符串?

在此先感谢..

回答

21

因为您没有执行查询。 Linq很懒。它会在您执行foreachToList/ToArray/ToDictionary时执行。

,我建议那样做

string test = new string(somestring.Take(50).ToArray()); 

甚至使用

string test = somestring.Substring(0, 50); 

更多一点。 Select旨在将某种转换应用于序列中的每个元素。该操作也被称为map。如果你想从序列中产生单个元素,它是Aggregate,又名reduce。这不是懒惰,它强制执行查询。

+0

'Remove'?我想你的意思是'Substring'? – Timwi 2010-09-23 11:57:52

+0

@Greg Linq是声明性框架。这对有志志的开发人员来说有时候是令人惊讶的。 – Andrey 2010-09-23 12:05:48

+0

如果'somestring'类型为'IEnumberable ',则不会编译。该字符串类没有一个重载的构造函数,它接受一个字符串数组。 – 2010-09-23 12:07:36

2

因为Select是懒惰的,所以您传入的函数只有在使用Select的结果后才会被评估。

一般来说,使用带有副作用的功能并不合适。您应该使用foreach代替。

在这种特殊情况下,您可以使用String.Join方法。

3

Select返回一个IEnumerable<char>但你没有枚举它在你的代码中,所以委托不会被执行。如果将其更改为:

string test = ""; 
somestring.Take(50).Select(
    delegate(char x) 
    { 
     test += x; 
     return x; 
    } 
).ToList(); 
3

因为您只声明序列,但是您从未执行过它。如果在最后添加了另一个.ToList(),则test将具有其中的字符。

但是,我强烈建议不要这样做。您正在使用序列评估导致副作用。你已经发现结果令人困惑。如果你真的只是想第50项的顺序,只需用Take独自:

var partSequence = fullSequence.Take(50); 

你上面的例子可以写成这样:

var partString = new string(someString.Take(50).ToArray()); 

,但我敢肯定你为此目的了解string.Substring()

14

(其他人解释了为什么它不起作用。)

你的问题并不完全在此刻意义 - 目前还不清楚是否是实际上处理一个IEnumerable<char>IEnumerable<string>。 (您的文字建议IEnumerable<string>;代码建议IEnumerable<char>)。如果它是一个IEnumerable<string>和你使用.NET 4中,它真的很容易:

string combined = string.Join("", list.Take(50)); 

如果您使用.NET 3.5,它仍然是相当容易:

string combined = string.Join("", list.Take(50).ToArray()); 

显然使用类似“ ,“如果你想要一个字符串之间的分隔符。

如果你正在处理一个普通IEnumerable<char>然后使用

string combined = new string(chars.Take(50).ToArray()); 

如果你实际上处理一个字符串,开始时,使用Substring :)

+1

是的,但我认为他想知道他的代码为什么不起作用。 – Timwi 2010-09-23 11:55:38

+0

他遍历字符串,参见'委托(char x)'。我不认为做字符串是有效的。加入字符集中的字符。 – Andrey 2010-09-23 11:56:39

+0

@Andrey:我在回答他声称他试图连接一个IEnumerable 而不是IEnumerable ......这个问题基本上是在这个时候破裂的。我已编辑表明。 – 2010-09-23 11:57:46

相关问题