Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查两个IEnumerable是否相等_C#_Linq - Fatal编程技术网

C# 检查两个IEnumerable是否相等

C# 检查两个IEnumerable是否相等,c#,linq,C#,Linq,我正在尝试创建一个helper方法,该方法将检查两个IEnumerable集合在序列中的元素和项目序列方面是否相等。我已经想出了一个解决方案,下面的功能似乎做的工作。我想知道是否有一种更有效的方法可以在两个IEnumerable集合之间执行这种比较,这种方法更清晰、更简洁 private static bool AreEnumerablesEqual<T>(IEnumerable<T> first, IEnumerable<T> second)

我正在尝试创建一个helper方法,该方法将检查两个
IEnumerable
集合在序列中的元素和项目序列方面是否相等。我已经想出了一个解决方案,下面的功能似乎做的工作。我想知道是否有一种更有效的方法可以在两个
IEnumerable
集合之间执行这种比较,这种方法更清晰、更简洁

    private static bool AreEnumerablesEqual<T>(IEnumerable<T> first, IEnumerable<T> second)
    {
        var firstList = first.ToList();
        var secondList = second.ToList();

        foreach (var item in firstList)
        {
            var itemIndex = firstList.IndexOf(item);
            if (!item.Equals(secondList[itemIndex]))
            {
                return false;
            }
        }
        return true;
    }
private static bool AreEnumerablesEqual(IEnumerable first,IEnumerable second)
{
var firstList=first.ToList();
var secondList=second.ToList();
foreach(第一个列表中的变量项)
{
var itemIndex=firstList.IndexOf(项目);
如果(!item.Equals(secondList[itemIndex]))
{
返回false;
}
}
返回true;
}
怎么样

你有两个选择

  • 使用
    T
    的默认相等比较器:

    public static bool SequenceEqual<TSource>(
        this IEnumerable<TSource> first,
        IEnumerable<TSource> second
    
  • 怎么样

    你有两个选择

  • 使用
    T
    的默认相等比较器:

    public static bool SequenceEqual<TSource>(
        this IEnumerable<TSource> first,
        IEnumerable<TSource> second
    

  • 回答得很好,但可能需要一点时间example@Jaxi你真的认为这个问题的作者不知道如何调用一个方法吗?你显然对他们的能力评价很低。@Servy我的意思是,在有可能被标记为低质量答案的情况下,@Jaxi在帖子中编辑无关信息会让事情变得更糟,而不是更好。@Servy他们添加了关于答案的附加信息,从长远来看,不仅仅是OP会阅读答案,这将是一个有着不同经历的人群。答案很好,但可能需要一点经验example@Jaxi你真的认为这个问题的作者不知道如何调用一个方法吗?你显然对他们的能力评价很低。@Servy我的意思是,在有可能被标记为低质量答案的情况下,@Jaxi在帖子中编辑无关信息会让事情变得更糟,而不是更好。@Servy他们添加了关于答案的附加信息,从长远来看,不仅仅是OP会阅读答案,这将是一系列具有不同经验的人。因此,即使传递的序列已经是一个列表,那么?
    ToList
    也会创建一个新列表。您只需使用
    as
    操作符尝试强制转换到
    IList
    (以包括数组)。如果强制转换成功,则无需创建和填充新集合。第二:不要使用
    foreach
    IndexOf
    如果您已经有一个列表,您可以通过索引访问。改为使用
    for
    -循环。如果您有
    ToList
    ,则可以确保它在性能方面得到改进。如果您想实现自己的方法,而不是
    SequenceEqual
    ,那么使用迭代器和迭代,而这两个迭代器都有一个下一个项加上项是相等的
    IndexOf
    是一个坏主意,如果您有类似
    new[]{1,1,1,1,1}
    的东西,它将匹配
    new[]{1,2,3,4,5,6}
    使用您的代码。因此,即使传递的序列已经是一个列表,也会创建一个新列表。您只需使用
    as
    操作符尝试强制转换到
    IList
    (以包括数组)。如果强制转换成功,则无需创建和填充新集合。第二:不要使用
    foreach
    IndexOf
    如果您已经有一个列表,您可以通过索引访问。改为使用
    for
    -循环。如果您有
    ToList
    ,则可以确保它在性能方面得到改进。如果您想实现自己的方法,而不是
    SequenceEqual
    ,那么使用迭代器和迭代,而这两个迭代器都有下一个项加上项是相等的
    IndexOf
    是一个坏主意,如果您有类似
    new[]{1,1,1,1,1}
    的东西,它将匹配
    new[]{1,2,3,4,5,6}