2017-06-16 39 views
0

我的問題是,我需要比較兩個列表,找到共享同一個字段的值對象的數量。請查找兩個列表的共同對象,或者一些連接操作。我不想使用Linq,因爲後來我需要訪問元素索引,但現在類/方法被簡化了。 類PIP:在兩個列表找到共同的項目

public class Pip{ 
    public CONTROLLER.COLORS Color; 
} 

簡體類序列,基本上是個點的列表

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; 
    } 
} 

所以現在我有這種方法,應當返還我相同顏色的點子量兩個序列,其中每個點是一些顏色。

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列表中的每個元素與當前畫中畫的顏色比較的checkPips名單PIP當前顏色。如果出現匹配,我們檢查,如果匹配lockPips「當前畫中畫已經得到遏制。如果沒有,那麼我們增加計數器,並添加lockPips「當前畫中畫checkedPips從而確保它將在下次檢查被跳過的名單。

調試顯示excludedPips列表中已經包含第一次檢查過的pip,並且它在每次檢查時都使用它的顏色,從而使算法跳過「if」語句中的所有指令。

實例:lockPips:紅,綠,青checkPips:紅,綠,青 預期matchedColors:3個實際matchedColors:1(RED)

lockPips:BLUE,青,藍checkPips:藍,藍,RED預期 matchedColors:2個實際matchedColors:1(藍色)

因此,在任何實際matchedColors> 0的結果爲1

回答

1

你不必寫自己的LO GIC爲了這個目的,因爲你可以使用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(); 
    } 
} 

或者,如果你想獲得的兩個List使用Zip共同對應的元素:

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

你可以做些什麼這樣

​​3210

然後,每當你想找到符合您的需求的PIP的原始索引做這樣的事

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,但如果你的唯一原因是要訪問索引解決了這個問題。

相關問題