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

С#: Ограничить длину строки?

Я просто задавался вопросом, как ограничить длину строки в С#.

string foo = "1234567890";

Скажи, что у нас это есть. Как я могу ограничить foo, чтобы сказать, 5 символов?

4b9b3361

Ответ 1

Строки в С# неизменяемы, и в некотором смысле это означает, что они фиксированного размера.
Однако вы не можете ограничить строковую переменную, чтобы принимать только n-символьные строки. Если вы определяете строковую переменную, ей может быть назначена любая строка. Если усечение строк (или метаданных ошибок) является неотъемлемой частью вашей бизнес-логики, подумайте о том, чтобы сделать это в настройках свойств вашего конкретного класса (это то, что предложил Джон, и это самый естественный способ создания ограничений на значения в .NET).

Если вы просто хотите убедиться, что это не слишком долго (например, передавая его как параметр в некоторый унаследованный код), обрезайте его вручную:

const int MaxLength = 5;


var name = "Christopher";
if (name.Length > MaxLength)
    name = name.Substring(0, MaxLength); // name = "Chris"

Ответ 2

Вы можете расширить класс "строка", чтобы вы могли возвращать ограниченную строку.

using System;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         // since specified strings are treated on the fly as string objects...
         string limit5 = "The quick brown fox jumped over the lazy dog.".LimitLength(5);
         string limit10 = "The quick brown fox jumped over the lazy dog.".LimitLength(10);
         // this line should return us the entire contents of the test string
         string limit100 = "The quick brown fox jumped over the lazy dog.".LimitLength(100);

         Console.WriteLine("limit5   - {0}", limit5);
         Console.WriteLine("limit10  - {0}", limit10);
         Console.WriteLine("limit100 - {0}", limit100);

         Console.ReadLine();
      }
   }

   public static class StringExtensions
   {
      /// <summary>
      /// Method that limits the length of text to a defined length.
      /// </summary>
      /// <param name="source">The source text.</param>
      /// <param name="maxLength">The maximum limit of the string to return.</param>
      public static string LimitLength(this string source, int maxLength)
      {
         if (source.Length <= maxLength)
         {
            return source;
         }

         return source.Substring(0, maxLength);
      }
   }
}

Результат:

limit5 - q
limit10 - The быстрый
limit100 - быстрый коричневый лиса перепрыгнула через ленивую собаку.

Ответ 3

Вы не можете. Имейте в виду, что foo является переменной типа string.

Вы можете создать свой собственный тип, скажем BoundedString, и иметь:

BoundedString foo = new BoundedString(5);
foo.Text = "hello"; // Fine
foo.Text = "naughty"; // Throw an exception or perhaps truncate the string

... но вы не можете остановить строковую переменную от установки любой строковой ссылки (или null).

Конечно, если у вас есть свойство string, вы можете сделать это:

private string foo;
public string Foo
{
    get { return foo; }
    set
    {
        if (value.Length > 5)
        {
            throw new ArgumentException("value");
        }
        foo = value;
    }
}

Помогает ли это вам в том, чем бы вы не занимались?

Ответ 4

Если это свойство класса, вы можете сделать это в настройщике:

public class FooClass
{
   private string foo;
   public string Foo
   {
     get { return foo; }
     set
     {
       if(!string.IsNullOrEmpty(value) && value.Length>5)
       {
            foo=value.Substring(0,5);
       }
       else
            foo=value;
     }
   }
}

Ответ 5

string shortFoo = foo.Length > 5 ? foo.Substring(0, 5) : foo;

Обратите внимание, что вы не можете просто использовать foo.Substring(0, 5) самостоятельно, потому что он выдаст ошибку, если foo меньше 5 символов.

Ответ 6

Вот еще один альтернативный ответ на этот вопрос. Этот метод расширения работает достаточно хорошо. Это решает проблемы, когда строка короче максимальной длины, а также максимальная длина является отрицательной.

public static string Left( this string str, int length ) {
  if (str == null)
    return str;
  return str.Substring(0, Math.Min(Math.Abs(length), str.Length));
}

Другим решением было бы ограничить длину неотрицательными значениями и просто отрицательные значения нуля.

public static string Left( this string str, int length ) {
  if (str == null)
    return str;
  return str.Substring(0, Math.Min(Math.Max(0,length), str.Length));
}

Ответ 7

Единственная причина, по которой я вижу цель в этом, - это хранить БД. Если да, почему бы не позволить БД обрабатывать его, а затем нажать исключение вверх по потоку для обработки на уровне презентации?

Ответ 8

Вы можете попробовать следующее:

var x= str== null 
        ? string.Empty 
        : str.Substring(0, Math.Min(5, str.Length));

Ответ 9

Вы можете избежать оператора if, если вы поместите его на длину, которую вы хотите ограничить.

string name1 = "Christopher";
string name2 = "Jay";
int maxLength = 5;

name1 = name1.PadRight(maxLength).Substring(0, maxLength);
name2 = name2.PadRight(maxLength).Substring(0, maxLength);

name1 будет содержать Chris

name2 будет иметь Jay

Нет инструкции if, чтобы проверить длину, прежде чем использовать подстроку

Ответ 10

foo = foo.Substring(0,5);

Ответ 11

Использовать Remove()...

string foo = "1234567890";
int trimLength = 5;

if (foo.Length > trimLength) foo = foo.Remove(trimLength);

// foo is now "12345"