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 の charを返しますが、ToStringメソッドは疑わしい文字列を返しません。次のように呼び出す必要があります。

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