4

検証する必要があるアイテムのリストがあります。リストには、タイプ A、B、および C の項目をいくつでも含めることができますが、リストを保存する前に、次の規則を確認する必要があります。

  1. A がある場合、B または C のいずれかが必要です
  2. BがあればAが必要

私は次のコード(saudoコード)になりました:

bool IsListValid()
{
  var a = list.ContainsAny(A);
  var b = list.ContainsAny(B);
  var c = list.ContainsAny(C);

  if (!a && !b)
    return true;

  if (a && (b || c)
    return true;

  return false;
}

私はこのコードが好きではありません。
1. Any を 3 回続けて使用すると、リストが 3 回繰り返される可能性
があります。

もちろん、異なる変数名を使用し、テストを適切な名前のメソッドに抽出する方が良いでしょうが、これを完全に解決するより良い方法があると思います. 方法がわからない...

任意のヒント?

4

3 に答える 3

3

私は単純なループを使用します、それは理解可能で効率的です。

bool containsA = false, containsB = false, containsC = false;
for (int i = 0; i < list.Count; i++)
{
    Type itemType = list[i].GetType();
    if (!containsA) containsA = itemType == typeof(A);
    if (!containsB) containsB = itemType == typeof(B);
    if (!containsC) containsC = itemType == typeof(C);
    if (containsA && (containsB || containsC)) return true;
}
return (!containsA && !containsB);
于 2012-04-25T14:12:22.457 に答える
2

リストを1回だけ確認することが非常に重要な場合は、次のようにすることができます。

bool a = false;
bool b = false;
bool c = false;
foreach(var x in list)
{
  if (x is A) a = true;
  if (x is B) b = true;
  if (x is C) c = true;
}

でもそのままにしておきます。後でプロファイリングにより、このコードがボトルネックになっていることがわかった場合は、もう一度確認できます。

に関してはif's、それは私にはうまく見えます。A、B、Cに適切な名前が付けられている限り(hasNotifyEmailまたはneedsResponseのようなもの、指定されたルールで機能させたい理由を説明するもの)、他の人が理解しやすいはずです。

于 2012-04-25T14:08:35.620 に答える
-1
var hasA = list.Any(x => x.GetType() == typeof(A));
var hasB = list.Any(x => x.GetType() == typeof(B));
var hasC = list.Any(x => x.GetType() == typeof(C));

//If you have A, you need either B or C
// A AND (B xor C)
if (hasA && (hasB ^= hasC))
   return true;

//If you have B, you need A
if (hasB && hasA)
   return true;

   return false;
于 2012-04-25T14:12:12.000 に答える