2

vm.TempRowKey が null のときに次の割り当てを行うと、newRowKey の値は null になりますか?

var newRowKey = vm.TempRowKey.DotFormatToRowKey();

また、dotFormatRowKey の形式が xx (x は数値) でない場合に、次の例外をスローさせる方法はありますか?

public static string DotFormatToRowKey(this string dotFormatRowKey) {
    var splits = dotFormatRowKey.Split('.')
                 .Select(x => String.Format("{0:d2}", Int32.Parse(x)))
                 .ToList();
    return String.Join(String.Empty, splits.ToArray());
}
4

6 に答える 6

3

vm.TempRowKeyがnullの場合

次にTempRowKey.DotFormatToRowKey();、null参照例外をスローします。

dotFormatRowKeyの形式がxxでない場合、例外をスローします。ここで、xは数値ですか?

public static string DotFormatToRowKey(this string dotFormatRowKey) 
{
    if (dotFormatRowKey == null)
        throw new ArgumentNullException("dotFormatRowKey");    

    // maybe @"^\d\d?\.\d\d?$" is a beter regex. 
    // accept only 1|2 digits and nothing before|after
    if (! Regex.IsMatch(dotFormatRowKey, @"\d+\.\d+"))  
       throw new ArgumentException("Expected ##.##, was " + dotFormatRowKey);

    var splits = dotFormatRowKey.Split('.')
                 .Select(x => String.Format("{0:d2}", Int32.Parse(x)))
                 .ToList();  // ToList() is never needed

    // ToArray() not needed in Fx >= 4.0
    return String.Join(String.Empty, splits.ToArray()); 
}

細かい部分:との両方を使用しToList()ToArray()splitsます。これは二重の作業であり、.NET4ではどちらも必要ありません。

于 2012-09-22T13:24:05.060 に答える
3

いいえ、結果は null にはなりません。null 参照を使用して拡張メソッドを呼び出すことはできますが、拡張メソッドは null 値を処理するように記述されていないためSplit、null 参照でメソッドを使用しようとすると例外が発生します。

形式「xx」を確認するには、 の結果の長さを確認してからSplit、 を使用TryParseして値を解析できたかどうかを確認します。

public static string DotFormatToRowKey(this string dotFormatRowKey) {
  var splits = dotFormatRowKey.Split('.');
  if (splits.Length != 2) {
    throw new FormatException("The string should contain one period.");
  }
  var s = splits.Select(x => {
    int y;
    if (!Int32.TryParse(x, out y)){
      throw new FormatException("A part of the string was not numerical");
    }
    if (y < 0 || y > 99) {
      throw new FormatExcetpion("A number was outside the 0..99 range.");
    }
    return y.ToString("d2");
  }).ToArray();
  return String.Concat(s);
}
于 2012-09-22T13:29:20.537 に答える
0

あなたの最初の質問のために..何が起こるか試してみてください。

2番目の質問は、を使用できますTryParse。それが単純に失敗した場合は、例外をスローします。

于 2012-09-22T13:22:57.283 に答える
0

nullかどうかを確認する必要があります。そうでない場合は、例外が発生します。

if (null == dotFormatRowKey)
    return null;

また、正規表現を使用してパターンを検証できます。

Regex.IsMatch(input, "^\d+\.\d+$");

見る

于 2012-09-22T13:24:43.827 に答える
0

vm.TempRowKey が null のときに次の割り当てを行うと、newRowKey の値は null になりますか?

dotFormatRowKey が null になり、null 値で Split() (拡張メソッドではない) を呼び出すため、これにより NullReferenceException が発生するはずです。

また、dotFormatRowKey の形式が xx (x は数値) でない場合に、次の例外をスローさせる方法はありますか?

現在、int.Parse() を使用すると、整数値と「.」のみが強制されます。すべての整数値が同じであることや、「.」が 1 つだけであることを強制するものではありません。(たとえば、これは 1.2.3 ではスローされません)。エラー チェックを追加する場合は、次のように簡単に実行できます。

// test that all int values were the same (not sure if you want this but you said x.x)
if (splits.Distinct().Count() > 1) { throw new ExceptionOfSomeSort("error"); }

// test that you have exactly two values
if (splits.Count != 2) { throw new ExceptionOfSomeSort("error"); }

別のオプションは、次のような正規表現を使用して、文字列全体を事前に検証することです。

@"\d+\.\d+"
于 2012-09-22T13:28:51.443 に答える
0
public static string DotFormatToRowKey(this string dotFormatRowKey)
        {
            Regex validationRegex = new Regex(@"\d.\d");
            if (!validationRegex.Match(dotFormatRowKey).Length.Equals(dotFormatRowKey.Length)) throw new FormatException("Input string does not support format x.x where x is number");

            var splits = dotFormatRowKey.Split('.')
                .Select(x => String.Format("{0:d2}", Int32.Parse(x)))
                .ToList();
            return String.Join(String.Empty, splits.ToArray());
        }
于 2012-09-22T13:33:09.513 に答える