2

2つの文字列配列を最速で比較したいと思います。
私は以下のようなものを手に入れました。

それが正しい方法でしょうか。または、より良い方法はありますか

            bool matching=false;
            //say templateArr is the template array and dataArr as array to be compared
            string[] templateArr = {"Dictionary_type","Translation_EN" };
            string[] dataArr = { "Dictionary_type", "Translation_EN" };

            if (templateArr.Union(dataArr).Distinct().Count() == templateArr.Count())
                matching = true;
4

4 に答える 4

6

コレクションの同等性をテストするには、次のように使用できEnumerable.SequenceEqualsます。

using System.Linq;

bool AreEqual()
{
    string[] templateArr = { "Dictionary_type", "Translation_EN" };
    string[] dataArr = { "Dictionary_type", "Translation_EN" };

    return templateArr.SequenceEquals(dataArr);
}

コレクションの同等性をテストする場合(要素の順序は重要ではありません)、次のようにset-equalityを使用できます。

bool AreEquivalent()
{
    string[] templateArr = { "Dictionary_type", "Translation_EN" };
    string[] dataArr = { "Dictionary_type", "Translation_EN" };

    return new HashSet<string>(templateArr).SetEquals(dataArr);
}

どちらの場合も、MSDNのドキュメントに従って、線形時間で実装されます。

于 2012-08-21T01:46:12.207 に答える
0

を作成してunionから、そのうちの1つだけで要素の総数を数えています。Union繰り返しを削除しますが、比較的コストのかかる操作であるため、それが最善のアプローチかどうかはわかりません。

この代替案を見てください:

        string[] templateArr = { "Dictionary_type", "Translation_EN" };
        string[] dataArr = { "Dictionary_type", "Translation_EN" };

        bool matching = templateArr.Length == dataArr.Length ? !templateArr.Any<string>(x => !dataArr.Contains(x)) : false;
于 2012-08-21T01:38:05.443 に答える
0

それらが同じ要素を持っているが順序が異なる場合、それらが等しくないと見なされるべきであると仮定すると、SequenceEqualを使用できます。

if (templateArr.SequenceEqual(dataArr))
    matching = true;

順序を無視する場合は、最初に配列を並べ替えます。

if (templateArr.OrderBy(x => x).SequenceEqual(dataArr.OrderBy(x => x)))
    matching = true;

また、重複も無視したい場合:

if (templateArr.Distinct().OrderBy(x => x).SequenceEqual(dataArr.Distinct().OrderBy(x => x)))
    matching = true;

または(より簡潔で、より高速になる可能性があります):

if (new HashSet<string>(templateArr).SetEquals(dataArr))
    matching = true;

ところで、あなたのコードは正しくありません-この場合、配列は一致すると結論付けられます:

string[] templateArr = { "Dictionary_type", "Translation_EN", "abc" };
string[] dataArr = { "Translation_EN", "Dictionary_type", "Translation_EN" };

if (templateArr.Union(dataArr).Distinct().Count() == templateArr.Count())
    matching = true;
于 2012-08-21T01:51:28.697 に答える
0

前のコメントによると、同等の配列を構成するものが明確になっていないため、質問は少しあいまいですが、同じ数の同じ文字列が(任意の順序で)含まれている場合は、配列を同等として扱うと仮定してから、 HashSet(array1).SetEquals(array2);へ

次の簡単な手法を使用して、配列が等しいかどうかを判断しようとします。

  1. 長さを比較します。長さが異なる場合は、falseの並べ替え配列を返し、カウンターを0に設定します。
  2. array[0]要素を比較します-異なる場合はfalseを返します
  3. foreachではなく、インデックスを使用して、次の手順を繰り返します。
  4. trueを返す

大規模なアレイに対するこのアプローチでは、実際にアレイをメモリにロードしたり、アレイ全体をハッシュ設定したりする代わりに、違いを見つける可能性が高いため、パフォーマンス/メモリの消費効率が向上します。

于 2012-08-21T01:58:45.177 に答える