Подтвердить что ты не робот

Как `.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?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

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

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