2 つの配列の類似性を表す数値を返そうとしています。
すなわち:
Array1: {Katy, Jenny, Sarah, Ben, Jill, Tina}
Array2: {Katy, John, Sam, Ben, Jill, Linda}
3 つの比較が正しいので、3 を返したいと思います。これは可能ですか?私のためにこれを行う機能は考えられません。
これは、一致するインデックスで等しいアイテムの数をカウントする方法です。
var c = arr1.Where((x, i) => x.Equals(arr2[i])).Count();
範囲外のインデックスでarr2にアクセスしようとしないようにする必要がある場合があることに注意してください。
var c = arr1.Take(arr2.Length).Count(...);
インデックスの位置を気にしない場合は、nemesvのソリューションを使用する必要があります。
これを行うには多くの方法があります。他の人がすでにいくつかの方法を指定しているので、同じことを行う別の方法を投稿しようとします.
インデックスに基づいてマッチングを検討する場合は、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()
この問題に取り組む方法は、最初の配列の値を取得して、2番目の配列の他のすべての値と比較することです。それらが一致する場合は、比較カウンターを増やします。これにより、一致する3つの比較がわかります。
私は次のようにします:
int count = array1.Zip(array2, (a, b) => a.Equals(b)).Count(b => b);
zip 部分は anIEnumerable<bool>
を返し、count 部分true
はそのリストに何回出現するかをカウントします。
これは私のために働く:
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();
編集:ああ、あなたが同じ位置にいることを望んでいるのを見ました。
「インデックスによると」と言っているのは、「ジョン」が最初のリストの位置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++;
}