2

頭を抱えているように見えない問題に直面しています。同じタイプのリストが 2 つあり、それらのリストが一致するかどうかを確認する必要があります。コメントアウトされた for ループと現在使用中のネストされた foreach ループに関して問題が発生しています。両方を使用する必要はありません。1つはこれを理解しようとしていたことです。

これをデバッガーで実行したところ、両方のリストが同じデータを保持していることがわかりました。(VS2010 デバッガーを使用して) リスト内の同じ要素にあると想定しています。ただし、ループしているときは、最初の要素で失敗します。

私は同様の質問からこれを調査しましたが、LINQ 式にはあまり詳しくありません (空き時間に調査するためにメモを取っています)。

private bool ListMatch(List<T> list1, List<T> list2) 
    {
        if (list1 == null && list2 == null)
        {
            return true;
        }
        if ((list1 == null) || (list2 == null))
        {
            return false;
        }
    if (list1.Count != list2.Count)
    {
        return false;
    }
    if( list1.Equals( list2 ) )
    {
        return true;
    }

    /*for (var idx = 0; idx < list1.Count; idx++)
    {
        if( list1[ idx ] != list2[ idx ] )
        {
            return false;
        }
    }*/

    foreach( var x in list1 )
    {
        bool hasDuplicates = false;
        foreach( var y in list2 )
        {

            if( x == y )
            {
                hasDuplicates = true;
                break;
            }
        }

        if( hasDuplicates )
        {
            return true;
        }
        return false;
    }

    return true;
}
4

4 に答える 4

0

これはデフォルトで参照の等価性であるため、使用==しないでください。値の等価性が本当に必要なため、アルゴリズムが失敗しているように聞こえます。それを使用Object.Equalsして上書きします。つまり、フレームワークがこれを行います(2 つのリストに同じ項目を同じ順序で配置する必要があると仮定します)。ループとその後のすべてを次のように置き換えます。

return list1.SequenceEqual(list2);

Object.Equalsリスト内の要素のタイプに対して がオーバーライドされている (または実装されている)ことを確認する必要があります。そうIEquatable<T>しないと、コード内の問題の 1 つと同じ問題が発生します。

または、等価性を比較する方法を渡すことができるオーバーロードがあります。何か特別なものが必要な場合や、オーバーライドしたくない場合がありますObject.Equals

于 2013-06-18T12:10:26.027 に答える
0

これらのインデックスのリストの参照を比較しています。次のように実行できます。Except演算子は、両方のリストに存在しない要素、つまり違いを含むリストを返します。これは、何かに使用する必要がある場合に便利です

List<T> result = list1.Except(list2).ToList();
if (result.count == 0)
//No differences
return true;
else
//Differences
return false;
于 2013-06-18T12:11:59.673 に答える