0

2 つの配列の類似性を表す数値を返そうとしています。
すなわち:

Array1: {Katy, Jenny, Sarah, Ben, Jill, Tina} 
Array2: {Katy, John, Sam, Ben, Jill, Linda}

3 つの比較が正しいので、3 を返したいと思います。これは可能ですか?私のためにこれを行う機能は考えられません。

4

6 に答える 6

5

これは、一致するインデックスで等しいアイテムの数をカウントする方法です。

var c = arr1.Where((x, i) => x.Equals(arr2[i])).Count();

範囲外のインデックスでarr2にアクセスしようとしないようにする必要がある場合があることに注意してください。

var c = arr1.Take(arr2.Length).Count(...);

インデックスの位置を気にしない場合は、nemesvのソリューションを使用する必要があります。

于 2012-10-11T05:08:04.173 に答える
1

これを行うには多くの方法があります。他の人がすでにいくつかの方法を指定しているので、同じことを行う別の方法を投稿しようとします.

インデックスに基づいてマッチングを検討する場合は、Zipを使用してこのようなことができます

var cnt = 0;
Array1.Zip(Array2,(a,b)=>{
    if(a.Equals(b)) ++cnt; 
    return string.Empty; //we dont need this
}).Count(); // use tolist or count to force evaluation

順序を気にせず、マッチングだけを気にする場合は、Intersectを使用できます

Array1.Intersect(Array2).Count()
于 2012-10-11T06:06:21.027 に答える
0

この問題に取り組む方法は、最初の配列の値を取得して、2番目の配列の他のすべての値と比較することです。それらが一致する場合は、比較カウンターを増やします。これにより、一致する3つの比較がわかります。

于 2012-10-11T05:08:14.277 に答える
0

私は次のようにします:

int count = array1.Zip(array2, (a, b) => a.Equals(b)).Count(b => b);

zip 部分は anIEnumerable<bool>を返し、count 部分trueはそのリストに何回出現するかをカウントします。

于 2012-10-11T07:03:10.567 に答える
0

これは私のために働く:

var array1 = new string[] {"Katy", "Jenny", "Sarah", "Ben", "Jill", "Tina"};
var array2 = new string[] {"Katy", "John", "Sam", "Ben", "Jill", "Linda"};

var similarity = (array1.Length + array2.Length) - array1.Union(array2).Count();

編集:ああ、あなたが同じ位置にいることを望んでいるのを見ました。

于 2012-10-11T05:15:18.767 に答える
0

「インデックスによると」と言っているのは、「ジョン」が最初のリストの位置1にあり、2番目のリストの位置2にある場合=>一致しないことを意味すると仮定します。

その場合:

int maxItems = Math.Min(arr1.Length, arr2.Length);
int matchCount = 0;

for(int i = 0; i < maxItems; i++)
{
  if(object.Equals(arr1[i], arr2[i]))
    matchCount++;
}
于 2012-10-11T06:13:39.487 に答える