C# 简化linq查询的迭代

C# 简化linq查询的迭代,c#,linq,C#,Linq,我目前在一个.NET4.7.1应用程序上工作。给出了一个for循环,用于比较两个列表并检查是否有任何Id发生了更改。如果列表1中的任何Id与列表2中的任何Id不同,我需要返回null,否则列表2将返回null 我目前通过一个简单的for迭代解决了这个问题。尽管如此,我想知道是否可以用LINQ语句更容易地解决这个问题 var list1 = new List<string> { "A", "B", "C" }; var list2 = new List<string

我目前在一个.NET4.7.1应用程序上工作。给出了一个for循环,用于比较两个列表并检查是否有任何Id发生了更改。如果列表1中的任何Id与列表2中的任何Id不同,我需要返回null,否则列表2将返回null

我目前通过一个简单的for迭代解决了这个问题。尽管如此,我想知道是否可以用LINQ语句更容易地解决这个问题

var list1 = new List<string>
{
  "A",
  "B",
  "C"
};

var list2 = new List<string>
{
  "A",
  "C",
  "B"
};

private List<string> Compare(){

 if (list1 != null)
 {
    for (int i = 0; i < list1.Count; i++)
    {
        if (list1[i] != list2[i])
        {
            return list2;
        }
    }
    return null;
 }

 return list2;
}
var list1=新列表
{
“A”,
“B”,
“C”
};
var list2=新列表
{
“A”,
“C”,
“B”
};
私有列表比较(){
if(list1!=null)
{
for(int i=0;i
您知道如何使用LINQ语句而不是for循环来解决这个问题吗


谢谢

这是For循环的一种linq替代方案

   private List<string> Compare()
    {
        if (list1 == null) return list2;
        if (list1.Where((x, i) => x != list2[i]).Any())
        {
            return list2;
        }

        return null;
    }
私有列表比较()
{
if(list1==null)返回list2;
if(list1.Where((x,i)=>x!=list2[i]).Any())
{
返回列表2;
}
返回null;
}

您可以使用
Zip
将项目分组比较,然后使用
All
确保项目相同:

private List<string> Compare()
{

 if (list1 == null) return list2;
 if (list1.Count != list2.Count) return null;

 bool allSame = list1.Zip(list2, (first, second) => (first, second))
                     .All(pair => pair.first == pair.second);


 return allSame ? list2 : null;
}

@FCin他们似乎想在相同的位置比较项目,而
除外
。您可能应该包括一项检查,以确保列表中的项目数量相同。请阅读
Zip
。代码表Q与描述不匹配,是吗?“如果列表1中的任何Id与列表2中的任何Id不同”这意味着要通过测试,两个列表中的所有元素都必须有一个id?=!我没听错吧?你的代码做了一些其他的事情…当我在同一个索引的可枚举表上做某事时,我想到的第一个是.Zip。但是afaik的可读性比Q的For循环要差(或重构为ForEach)-Loop@Sean但是想知道为什么你只需要一个循环就可以进行压缩和再次比较,你看到了什么优势吗?
返回allSame?list2:null;
这就是OP的代码吗?@mjwills-代码与问题不同!问题是“如果列表1中的任何Id与列表2中的任何Id不同,我需要返回null",而他的例子中的代码正好相反!@Sean给出了所选的答案,我怀疑代码是他们期望的行为的准确指示器。但是,是的,这个问题充其量是令人困惑的。这不适用于
list1
list2
长度不同的情况,尽管公平地说,question并没有说它们可以是不同的长度。我不知道Where()!
list1的重载。Where((l1,index)=>l1!=list2[index])。任何()
都会读得更好,不是吗?@FalcoAlexander是的,同意!
private List<string> Compare()
{

 if (list1 == null) return list2;

 bool allSame = list1.SequenceEqual(list2);      
 return allSame ? list2 : null;
}