Я просто задавался вопросом, как ограничить длину строки в С#.
string foo = "1234567890";
Скажи, что у нас это есть. Как я могу ограничить foo, чтобы сказать, 5 символов?
Я просто задавался вопросом, как ограничить длину строки в С#.
string foo = "1234567890";
Скажи, что у нас это есть. Как я могу ограничить foo, чтобы сказать, 5 символов?
Строки в С# неизменяемы, и в некотором смысле это означает, что они фиксированного размера.
Однако вы не можете ограничить строковую переменную, чтобы принимать только n-символьные строки. Если вы определяете строковую переменную, ей может быть назначена любая строка. Если усечение строк (или метаданных ошибок) является неотъемлемой частью вашей бизнес-логики, подумайте о том, чтобы сделать это в настройках свойств вашего конкретного класса (это то, что предложил Джон, и это самый естественный способ создания ограничений на значения в .NET).
Если вы просто хотите убедиться, что это не слишком долго (например, передавая его как параметр в некоторый унаследованный код), обрезайте его вручную:
const int MaxLength = 5;
var name = "Christopher";
if (name.Length > MaxLength)
name = name.Substring(0, MaxLength); // name = "Chris"
Вы можете расширить класс "строка", чтобы вы могли возвращать ограниченную строку.
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 - быстрый коричневый лиса перепрыгнула через ленивую собаку.
Вы не можете. Имейте в виду, что 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;
}
}
Помогает ли это вам в том, чем бы вы не занимались?
Если это свойство класса, вы можете сделать это в настройщике:
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;
}
}
}
string shortFoo = foo.Length > 5 ? foo.Substring(0, 5) : foo;
Обратите внимание, что вы не можете просто использовать foo.Substring(0, 5) самостоятельно, потому что он выдаст ошибку, если foo меньше 5 символов.
Вот еще один альтернативный ответ на этот вопрос. Этот метод расширения работает достаточно хорошо. Это решает проблемы, когда строка короче максимальной длины, а также максимальная длина является отрицательной.
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));
}
Единственная причина, по которой я вижу цель в этом, - это хранить БД. Если да, почему бы не позволить БД обрабатывать его, а затем нажать исключение вверх по потоку для обработки на уровне презентации?
Вы можете попробовать следующее:
var x= str== null
? string.Empty
: str.Substring(0, Math.Min(5, str.Length));
Вы можете избежать оператора 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, чтобы проверить длину, прежде чем использовать подстроку
foo = foo.Substring(0,5);
Использовать Remove()...
string foo = "1234567890";
int trimLength = 5;
if (foo.Length > trimLength) foo = foo.Remove(trimLength);
// foo is now "12345"