IEnumerable <string>到string

Sta*_*ker 14 c# linq

考虑一下:

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

现在为什么之后测试是空的?我不关心它的回归,实际上我知道它的IEnumerable.

任何方式,如果这一切似乎一团糟然后如何转换IEnumerable<char>为字符串?

提前致谢..

And*_*rey 21

因为您没有执行查询.Linq很懒.当你做任何一个foreachToList/ ToArray/ 时它将被执行ToDictionary.

我建议那样做

string test = new string(somestring.Take(50).ToArray());
Run Code Online (Sandbox Code Playgroud)

甚至使用

string test = somestring.Substring(0, 50);
Run Code Online (Sandbox Code Playgroud)

更多内容.Select旨在按顺序对每个元素应用某种变换.此操作也称为map.如果你想从序列中产生单个元素,那Aggregate就是reduce.它不是懒惰,它强制执行查询.


Jon*_*eet 15

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

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

string combined = string.Join("", list.Take(50));
Run Code Online (Sandbox Code Playgroud)

如果您使用的是.NET 3.5,它仍然非常简单:

string combined = string.Join("", list.Take(50).ToArray());
Run Code Online (Sandbox Code Playgroud)

如果你想要字符串之间的分隔符,显然使用类似","的东西.

如果你正在与一名将军打交道,IEnumerable<char>那就用吧

string combined = new string(chars.Take(50).ToArray());
Run Code Online (Sandbox Code Playgroud)

如果您实际上正在处理一个字符串,请使用Substring:)

  • ""超过string.Empty?去你的手:P (2认同)