web-dev-qa-db-ja.com

文字列に対して `.Take()`を実行し、最後に文字列を取得する方法は?

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を使用して文字列を特定の長さにトリミングする方法があるかどうかを知りたいのですが。

24
rtpHarry

これを行うための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);

これには、文字列がすでに目的の長さよりも短い場合に、一時的な配列/オブジェクトを作成しないという利点があります。

21

文字列を作成するだけ

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

文字列のネイティブメソッドにも注意してください

string res = SomeText.Substring(0, 6);
18
Stecya

私はこれに数回遭遇し、以下を使用します:

string.Join(string.Empty,yourString.Take(5));
8
AutoGibbon

SomeText.Take(6)はcharの IEnumerable を返し、ToStringメソッドは次のように呼び出す必要のある疑わしい文字列を返しません:

string [] array = SomeText.Take(6).ToArray();
string result = new string(array);
3
Homam