2014-02-24 27 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