2016-04-22 14 views
0
foreach (Objecta a in aList()) 
{ 
    foreach (Objectb b in bList) 
    { 
     if (a.variable != b.variable1 && a.variable() != b.variable2) 
     { 
      a.setVariable("Error"); 
     } 
    } 
} 

私が問題になるのは、foreachループを最初に通過し、変数にエラーを設定し、他の値(ループを再び通過するとき)が一致するかどうかをチェックせずに設定することです。は、条件がC#で満たされていない場合、foreachループの最後に何かに変数を設定する方法はありますか?

は、私が希望することは、最終的にフラグをエラーに設定しaListで何もbListに変数ターゲットに& &変数ソースと一致しない場合、すべてのリストを通って、最後foreachループ反復で行くまで待つことです。

この問題を回避するための提案があれば幸いです。

+1

var wrongVals = aVals.Except(correctVals); 

今、あなたは間違っているし、それに応じて行動することができる値を持っています。説明は私には分かりません。 – user2864740

+0

foreachの(店舗S processFlowStores.getStoresListに()){ foreachの(processFlowLinksにおけるリンクl) {IF(s.getNodeId()!= l.getLinkSource()&& s.getNodeId()!= L .getLinkTarget()) { s.setID( "エラー:FailedOperationエラー - 123.123.121"); } } } – Rejuan

+0

idがあるストアとsourceidとtargetidのリンクがあります。ストアにリンク元またはターゲットとの接続がないIDがある場合、そのストアのIDをエラー状態に設定します。問題はリンクのリストがあり、リンク1がストアIDを満たしていないと言っていますが、エラーに設定しますが、l2はターゲットのソースに一致するため、should notになります。これは以前に設定されていたので、これはエラーではないことを認識しないうちに設定されていたからです。例えば、 – Rejuan

答えて

0
foreach (Store s in processFlowStores.getStoresList()) 
{ 
    if (!processFlowLinks.Any(l => s.getNodeId() == l.getLinkSource() || 
            s.getNodeId() == l.getLinkTarget())) 
    { 
     s.setID("Error: FailedOperation Error - 123.123.121"); 
    }  
} 

EDIT:Linqを使用したよりコンパクトなソリューション。基本的に、いずれのリンクにもソースまたはターゲットのいずれもない場合は、エラーとしてマークします。

2

他の方法でやり直してください。一致しないものを検索するのではなく、一致するものを検索します。

foreach (Objecta a in aList()) 
{ 
    bool foundMatch = false; 
    foreach (Objectb b in bList) 
    { 
     if (a.variable == b.variable1 || a.variable() == b.variable2) 
     { 
      foundMatch = true; 
      break; 
     } 
    } 
    if (!foundMatch) 
    { 
     a.setVariable("Error"); 
    } 
} 
0

これはあなたが探しているものだと思います。 StoreListが外側のループで、LinkListが内側のループである場合すべてのリンクを検索して、店舗IDと一致するIDがあるかどうかを確認します。一致した場合は、リンクの検索を停止します。リンクを検索した後、一致するものがなければ店舗にエラーを設定し、次の店に行く。

まずaListのとbListからすべての項目値を選択して、別々の配列に入れ:

foreach (Objecta a in aList()) 
    { 
     var foundMatch = false; 

     foreach (Objectb b in bList) 
     { 
      if (a.variable == b.variable1 || a.variable() == b.variable2) 
      { 
       fondMatch = true; 
       break; 
      } 
     } 

     if (!foundMatch) a.setVariable("Error"); 
    } 
+0

このソリューションでは、有効な入力で始まり、最初のsが真で残りが偽の場合、falseに設定されることはないため、エラーが発生します。(ストアには、店舗) – Rejuan

+0

あなたは何を意味するか分かりません。リンクの検索を開始する前に、foundMatchをfalseに設定します。ソースまたはターゲットがストアIDと等しいリンクが見つかった場合にのみtrueに設定され、その時点で検索が停止します。それがすべてのリンクを通過し、いずれかのリンクにストアIDを見つけられなかった場合、foundMatchはfalseのままとなり、ストアのエラーを設定します。 – Marc

+0

基本的に店舗はs1、s2、s3、s4です とリンクはs1、s3、s4です ストアs2はエラーですが、ストアs1はリンクs1と一致するため、リンクがないのでストアs2をfalseに設定するものはありませんs2 – Rejuan

0

は、私はあなたがこのような何かしたいと思うの値を取得し、その後

var aVals = aList.Select(x=>x.value1).ToArray(); 
var bListVals1 = bItems.Select(x=>x.value1).ToArray(); 
var bListVals2 = bItems.Select(x=>x.value2).ToArray(); 
var bVals = bListVals1.Concat(bListVals2); 

を両方リストは共通しています:

var correctVals = bVals.Intersect(aVals); 

これらは正しい値であり、他のすべての値間違っ再:おそらく、関連する(ただし、小)の入力例を示すために役立つこと、および所望の結果を説明するだろう

wrongAItems = aList.Where(a => wrongVals.Contains(a.value)); 
foreach(wrongA in wrongAItems){ 
    wrongA.setVariable("Error"); 
} 
関連する問題