各項目が各配列に 1 回しか表示されないことが確実な場合は、それらを連結してカウントを取得できます。次に例を示します。
var arrs = new[] { arr1, arr2, arr3, arr4, arr5, arr6 };
var intermediate = arrs.SelectMany(a => a)
.GroupBy(x => x)
.Select(g => new { g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
var maxCount = intermediate.First().Count;
var results = intermediate.TakeWhile(x => x.Count == maxCount);
または、クエリ構文を好む場合は、次のようになります。
var arrs = new[] { arr1, arr2, arr3, arr4, arr5, arr6 };
var intermediate =
from a in arrs.SelectMany(a => a)
group a by a into g
orderby g.Count() descending
select new { g.Key, Count = g.Count() };
var maxCount = intermediate.First().Count;
var results = intermediate.TakeWhile(x => x.Count == maxCount);
結果セットには 3 つの項目が含まれます。
Key, Count
"A", 4
"B", 4
"D", 4
アップデート
更新された質問を考えると、次のようなものが機能するはずです。
var items = arrs.SelectMany(a => a).Distinct();
var pairs =
from a in items
from b in items
where a.CompareTo(b) < 0
select new { a, b };
var results =
(from arr in arrs
from p in pairs
where arr.Contains(p.a) && arr.Contains(p.b)
group arr by p into g
orderby g.Count() descending
select g.Key)
.First();
ここでのロジックは次のとおりです。
- 最初に、任意の配列内のすべての個別のアイテムを見つけます
- 次に、検索するアイテムのすべてのペアを見つけます
- そのペアを含む配列のリストによってグループ化されたすべてのペアを取得します
- グループごとに、各ペアを含む配列の数で降順に並べ替えます
- 最初のペアを返す