2014-02-24 90 views
0

我有兩個字符串集合,並且如果該值不存在於集合中且值的索引不等於,則需要返回任何字符串值。我實現與不存在的條件,但我不知道添加索引不等於條件。按值和索引比較兩個列表<string>

public IEnumerable<string> GetInvalidHeaders(IEnumerable<string> list1, List<string> list2) 
{    
    return list1.Where(header => list2 == null 
           || list2.All(x => x != header)); 
} 

值的集合必須由價值指數和獨特的

+2

我試圖破譯你的問題,但不能這樣做。你能改述一下嗎? –

+3

這確切不清楚你的意思。如果您可以提供樣本輸入和輸出,特別是在列表長度不相同的情況下,這將非常有幫助。 –

+0

你可能想使用.Contains()list1.where(header => list2.contains(header))? – Mat

回答

2

這將接受不僅串並使用延遲執行:

public IEnumerable<T> GetDifferences<T>(IList<T> seq1, IList<T> seq2) 
{ 
    for (int i = 0; i < seq1.Count; i++) 
    { 
     T item1 = seq1[i]; 
     if (i >= seq2.Count) 
      yield return item1; 
     else 
     { 
      T item2 = seq2[i]; 
      if (!object.ReferenceEquals(item1, item2)) 
      { 
       if (item1 == null || item2 == null) 
        yield return item1; 
       else if (!item1.Equals(item2)) 
        yield return item1; 
      } 
     } 
    } 
} 

用法:

var diff = GetDifferences(list1, list2); 
+0

在最後一部分,爲什麼不直接使用'if(object.Equals(item1,item2))'並且用'null'和引用相等性測試跳過額外的情況?如果你想在值類型的情況下避免裝箱,可以寫成'if(EqualityComparer .Default.Equals(item1,item2))'。 –

+0

建議:從'IList的 SEQ1更改簽名,IList的 seq2'到'IReadOnlyList SEQ1,IReadOnlyList seq2'因爲你只從'seq1'和'seq2',你會得到獎勵_read_是IReadOnlyList 的'協方差'這意味着你的方法可以用在更多的情況下(例如使用基類和派生類)。 –

4
public IEnumerable<string> GetDifferences(List<string> list1, List<string> list2) 
{ 
    for (int i = 0; i < list1.Count; i++) 
    { 
     if (list1[i] != list2[i]) yield return list1[i]; 
    } 
} 

你需要這樣的東西嗎?

+1

不錯 - 在此之後,重複'list2'與'list1'的區別。 – StuartLC

+0

如果list1有兩個項目,list2有一個項目我有System.ArgumentOutOfRangeException – zrabzdn

+0

然後,你只需要if(i> = list2.Count || list1 [i]!= list2 [i])代替if語句 – krimog