web-dev-qa-db-ja.com

C#:文字列の長さを制限しますか?

C#で文字列の長さをどのように制限できるのか、単に疑問に思っていました。

string foo = "1234567890";

それがあるとしましょう。 fooを5文字と言うように制限するにはどうすればよいですか?

42
Lemmons

C#の文字列は不変であり、ある意味では固定サイズであることを意味します。
ただし、constrain n文字の文字列のみを受け入れる文字列変数は使用できません。文字列変数を定義する場合、any文字列を割り当てることができます。文字列の切り捨て(またはエラーのスロー)がビジネスロジックの重要な部分である場合は、特定のクラスのプロパティセッターで行うことを検討してください(これはJonが提案したもので、.NETで値に制約を作成する最も自然な方法です)。

長くしすぎないようにしたい場合(たとえば、レガシーコードにパラメーターとして渡す場合)、手動で切り捨てます:

const int MaxLength = 5;


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

「string」クラスを拡張して、制限された文字列を返すことができます。

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-クイック
limit100-速い茶色のキツネが怠laな犬を飛び越えました。

34
Michael

できません。 foostring型の変数であることに注意してください。

独自のタイプ、たとえばBoundedStringを作成して、次のものを作成できます。

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

...しかし、文字列変数が文字列参照(またはnull)に設定されるのを止めることはできません。

もちろん、文字列propertyがある場合は、次のようにできます。

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

それはあなたのより大きなコンテキストが何であれあなたを助けますか?

16
Jon Skeet

これがクラスプロパティにある場合は、セッターで実行できます。

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;
     }
   }
}
6
jmservera

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

Fooが5文字未満の場合はエラーをスローするため、foo.Substring(0、5)を単独で使用することはできません。

5
TTT

この問題に対する別の代替回答を次に示します。この拡張メソッドは非常にうまく機能します。これにより、文字列が最大長より短く、最大長が負になるという問題が解決されます。

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));
}
3
Archangel33

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ステートメントはありません

2
Chris Ward

あなたはこのように試すことができます:

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

これで目的がわかる唯一の理由は、DBストレージのためです。もしそうなら、なぜDBがそれを処理してからプレゼンテーション層で処理されるように例外を上流にプッシュしてみませんか?

2
Aaron McIver

Remove() ...を使用します.

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

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

// foo is now "12345"
0
Sunsetquest