c#为一组对象获取属性并确保所有对象的值相同

时间:2013-05-15 23:38:21

标签: c# linq

嗨说我有一个班级PaymentGroup,一个PaymentGroup有一个付款清单。每笔付款都有一个代码。

规则是组内的所有付款必须具有相同的代码。

我想以某种方式获取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 个答案:

答案 0 :(得分:3)

为什么不能这样:

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

如果它包含多个代码,这将抛出 InvalidOperationException ,并显示消息“ Sequence包含多个元素”。

答案 1 :(得分:1)

var firstCode = Payments.First().Code;

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

return firstCode;

如果找到与第一个不匹配的付款,这将提前终止,如果所有代码相同,则不必再次枚举付款。

答案 2 :(得分: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
}

答案 3 :(得分:0)

你可以回到基础(假设你的意思是实际的List< Payment>):

var code = Payments[0].Code;
for (int i = 1; i < Payments.Count; i++) {
    if (Payments[i].Code != code) {
         throw new Exception();
    }
}
return code;