как `.Take ()` на строку и получить строку в конце? - PullRequest
24 голосов
/ 21 мая 2011

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 ]

19 голосов
/ 21 мая 2011

В 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);

Это имеет преимущество в том, что не создает никаких временных массивов / объектов, когда строка уже короче желаемой длины.

17 голосов
/ 21 мая 2011

Просто создайте строку

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

Также обратите внимание на нативные методы строки

string res = SomeText.Substring(0, 6);
7 голосов
/ 17 июля 2012

Я сам несколько раз сталкивался с этим и использую следующее:

string.Join(string.Empty,yourString.Take(5));
3 голосов
/ 21 мая 2011

SomeText.Take(6) вернет IEnumerable символа char, а метод ToString не вернет подозреваемую строку, которую нужно вызвать, как показано ниже:

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