2017-06-16 14 views
0

私の問題は、2つのリストを比較し、同じフィールドの値を共有するオブジェクトの量を見つける必要があるということです。 2つのリストの共通オブジェクト、またはいくつかの結合操作を見つけます。私は、Linqを後で使うために要素のインデックスにアクセスする必要はありませんが、今のところクラス/メソッドは単純化されています。 クラスピップ:だから今、私は私に二つの配列のために同じ色のピップの量を返還しなければならない。この方法は、それぞれが持っている基本的ピップ2つのリストの共通項目を見つける

public class Sequence{ 
    private List<Pip> pips = new List<Pip>(); 

    public Sequence(Pip[] pips) 
    { 
     for (int i = 0; i < pips.Length; i++) 
     { 
      addPip(pips[i]); 
     } 
    } 
    public List<Pip> getPips() 
    { 
     return pips; 
    } 
} 

のリストである

public class Pip{ 
    public CONTROLLER.COLORS Color; 
} 

簡素化されたクラスのシーケンスピップは色があります。

private int getMatchedColors(Sequence lockSeq, Sequence checkSeq) 
{ 
    List<Pip> lockPips = lockSeq.getPips(); 
    List<Pip> checkPips = checkSeq.getPips(); 
    List<Pip> excludedPips = new List<Pip>(lockPips.Count); 
    int matchedColors = 0; 

    for (int i = 0; i < lockPips.Count; i++) 
     for (int j = 0; j < checkPips.Count; j++) 
      if (checkPips[i].Color == lockPips[j].Color && !excludedPips.Contains(lockPips[j])) 
      { 
       matchedColors++; 
       excludedPips.Add(lockPips[j]); 
       break; 
      } 
    return matchedColors; 
} 

論理が始まる理由は次にあります。 lockPipsの各要素を持ち、現在のpipの色をcheckPips 'list pipの現在の色と比較します。一致が発生した場合、一致したlockPips 'の現在のpipが既にチェックされているかどうかをチェックします。そうでない場合は、カウンタをインクリメントして、checkedPipsのリストにlockPips '現在のピップを追加し、次のチェックでスキップされることを確認します。

デバッグすると、最初にチェックされたピップがリストに既に含まれており、すべてのチェックでその色が使用されるため、「if」ステートメントのすべての命令をスキップするアルゴリズムを示しています。

例:lockPips:RED、GREEN、G​​REEN checkPips:RED、GREEN、G​​REEN 予想matchedColors:3実際matchedColors:1(RED)

lockPips:青、青、checkPips:BLUE、BLUE 2実際のmatchedColors:1(BLUE)

だから、実際matchedColors> 0での結果はあなたがあなた自身のLOを記述する必要はありません。1.

答えて

1

で、REDは matchedColorsを期待しましたこれは、LINQとIntersectメソッドを使用して目的の結果を得ることができるためです。このように:あなたのクラスで

List<Pip> excludedPips = lockPips.Intersect(checkPips).ToList(); 

も:

public class Pip 
{ 
    public string Color { get; set; } 

    public override bool Equals(object obj) 
    { 
     if (!(obj is Pip)) 
      return false; 
     Pip p = (Pip)obj; 
     return (p.Color == Color); 
    } 
    public override int GetHashCode() 
    { 
     return String.Format("{0}", Color).GetHashCode(); 
    } 
} 

それとも、2つのリストを使用Zipの共通対応する要素を取得したい場合:

List<Pip> excludedPips = lockPips.Zip(checkPips , (f,s) => f.Color == s.Color ? f : null) 
            .Where(c => c!= null).ToList(); 
0

あなたが何かを行うことができますこのように

​​3210

そして、あなたが一致して、ご希望のピップの元のインデックスを検索したい場合は、必ずこの

List<int> indexes = new List<int>(); 

if (L1.Contains(desiredPip)) indexes = Enumerable.Range(0, L1.Count).Where(i => L1[i].Color == desiredPip.Color).ToList(); 

if (L2.Contains(desiredPip)) indexes = Enumerable.Range(0, L2.Count).Where(i => L2[i].Color == desiredPip.Color).ToList(); 

ような何かを、私はあなたがLINQを使用したくありませんでしたが、あなたの唯一の理由は、あなたがしたいということであれば言っ知っていますインデックスにアクセスすると、この問題が解決されます。

関連する問題