1

こんにちは、PaymentGroup というクラスがあり、PaymentGroup には Payments のリストがあります。各支払いにはコードがあります。

ルールは、グループ内のすべての支払いが同じコードを持つ必要があるということです。

どうにかして PaymentGroup のコードを取得したいのですが、PaymentGroup 内の Payments のすべてが同じコードを持っていない場合、例外がスローされます。

私がこれまでに持っているコードは、PaymentGroup のプロパティです。

public Code
{
  get
  {
    var codesTheSame = Payments.Select(x => x.Code)
                              .Distinct()
                              .Count() == 1;

    if(!codesTheSame)
      throw Exception();

    return Payments.First().Code;
  }
}

これはもっときれいに書くことができると思いますが、代替案は思いつきませんでした。

何か案は?

4

4 に答える 4

3

次のようなものではないのはなぜですか:

public Code
{
    get {
        return Payments.Select(x => x.Code)
                              .Distinct()
                              .Single();
    }
}

これにより、複数のコードが含まれている場合、 「シーケンスに複数の要素が含まれています」というメッセージとともにInvalidOperationExceptionがスローされます。

于 2013-05-15T23:43:05.330 に答える
1
var firstCode = Payments.First().Code;

if (Payments.Any(p => p.Code != firstCode))
    throw Exception();

return firstCode;

最初のものと一致しない支払いが見つかった場合、これは早期に終了し、すべてのコードが同じ場合、支払いを再度列挙する必要はありません。

于 2013-05-15T23:45:18.313 に答える
0
var groups = Payments.GroupBy(p => p.Code).ToList();
if(groups.Count > 1) throw new Exception("Multiple codes in group");
else if(groups.Count == 1) return groups[0].Key
else {
    //Payments is empty
}
于 2013-05-15T23:41:47.957 に答える