26

LINQ to Objects 支持对字符串对象的查询,但是当我使用如下代码时:

string SomeText = "this is some text in a string";
return SomeText.Take(6).ToString();

我得到的是:

System.Linq.Enumerable+<TakeIterator>d__3a`1[System.Char]

这在这个问题中被讨论为“意外”,但这是我真正想要做的,我无法通过任何地方的搜索找到它。

我知道还有其他方法可以操作字符串,但我也知道您可以使用 LINQ 做一些非常酷的技巧,我只是想知道是否有办法使用 LINQ 将字符串修剪到一定长度?

4

4 回答 4

23

System.Linq 没有内置方法来执行此操作,但您可以相当轻松地编写自己的扩展方法:

public static class StringExtensions
{
    public static string ToSystemString(this IEnumerable<char> source)
    {
        return new string(source.ToArray());
    }
}

不幸的是,由于object.ToString存在于所有 .NET 对象上,因此您必须为该方法指定一个不同的名称,以便编译器调用您的扩展方法,而不是内置的ToString.

根据您在下面的评论,很高兴质疑这是否是正确的方法。因为String通过它的公共方法公开了很多功能,所以我会将此方法实现为String自身的扩展:

/// <summary>
/// Truncates a string to a maximum length.
/// </summary>
/// <param name="value">The string to truncate.</param>
/// <param name="length">The maximum length of the returned string.</param>
/// <returns>The input string, truncated to <paramref name="length"/> characters.</returns>
public static string Truncate(this string value, int length)
{
    if (value == null)
        throw new ArgumentNullException("value");
    return value.Length <= length ? value : value.Substring(0, length);
}

您可以按如下方式使用它:

string SomeText = "this is some text in a string";
return SomeText.Truncate(6);

当字符串已经短于所需长度时,这具有不创建任何临时数组/对象的优点。

于 2011-05-21T18:42:01.677 回答
21

只需创建字符串

string res = new string(SomeText.Take(6).ToArray());

还要注意字符串原生方法

string res = SomeText.Substring(0, 6);
于 2011-05-21T18:44:19.307 回答
8

我自己遇到过几次并使用以下内容:

string.Join(string.Empty,yourString.Take(5));
于 2012-07-17T15:32:20.027 回答
4

SomeText.Take(6)将返回一个IEnumerablechar of char,并且ToString方法不会返回您需要调用它的可疑字符串,如下所示:

string [] array = SomeText.Take(6).ToArray();
string result = new string(array);
于 2011-05-21T18:51:07.927 回答