2

すべてが一意でなければならない5つの整数値があるとしましょう。

int a;
int b;
int c;
int d;
int e;

明らかに、私はそれをテストするためにこのようなことをすることができます:

if (a == b) {
    return false;
} else if (a == c) {
    return false;
} else if (a == d) {
    return false;
}
//etc etc

しかし、それは私の意見では非常に厄介なコードになります。これを行うための「よりクリーンな」方法はありますか?

4

7 に答える 7

6

すべての値をセットに入れることができ、セットのカーディナリティが入力した値の数と等しいことを確認してください。

ISet<int> vals = new HashSet<int> {
    a, b, c, d, e
};
if (vals.Count != 5) {
    Console.WriteLine("All values must be unique");
}
于 2012-10-16T13:23:46.250 に答える
3

おそらく少しオーバーヘッドがありますが、次のことができます。

new [] {a, b, c, d, e}.Distinct().Count() == 5
于 2012-10-16T13:25:06.030 に答える
2
List<int>() list = new List<int>(){a,b,c,d,e};

bool unique = list.Count() == list.Distinct().Count();
于 2012-10-16T13:26:50.217 に答える
2

テストされていませんが、次のようなヘルパーメソッドを作成することもできます。

static bool AreDistinct<T>(params T[] vals)
{
    for(int i = 0; i < vals.Length - 1; i++)
        for(int j = i + 1; j < vals.Length; j++)
            if(vals[i].Equals(vals[j]))
                return false;

    return true;
}

そしてそれを次のように呼びます:

AreDistinct(a, b, c, d, e)
于 2012-10-16T13:33:59.873 に答える
1
List<int> elements = new List<int>(){a,b,c,d,e};
if (elements.Distinct().Count() == elements.Count)
{
    //all elements are different
}
else
{

}
于 2012-10-16T13:25:42.413 に答える
1

一度に2つの値しか比較していないため、(n-1)になります。比較。

あなたは本当にIc。の答えを考慮すべきです。彼は、冗長な比較を避けるために、jをiの値+1だけオフセットします。それはそれが得るのと同じくらい簡潔で効率的です。

ただし、比較を書き出す必要がある場合は、次のようにします。

if (a == b || a == c || a == d || a == e)
    return false;

if (b == c || b == d || b == e)
    return false;

//etc.
于 2012-10-16T13:39:08.450 に答える
0

クリーン度については議論の余地があるかもしれませんが、それらを並べ替える場合は、(必要に応じて)(n ^ 2)ではなく(n lg n)にある隣接する各ペアを比較します。

于 2012-10-17T18:35:18.877 に答える