Apparently, you need something like this:
var l1 = new[] { "ΠΊΠΎΡΠΈΠΊ", "ΠΊΠΎΡΠΈΠΊ", "ΡΠ»ΠΎΠ½ΠΈΠΊ", "Π·Π°ΠΉΡΠΈΠΊ", "ΠΠ°ΡΠΌΠ°Π»Π΅ΠΉ" }; var mostOften = l1.GroupBy(s => s) // ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΡΡΡΠΎΠΊΠΈ .OrderByDescending(g => g.Count()) // ΠΎΡΡΠΎΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ Π³ΡΡΠΏΠΏΡ .First() // ΡΠ°ΠΌΡΠΉ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π³ΡΡΠΏΠΏΡ .First(); // Π±Π΅ΡΡΠΌ ΠΈΠ· Π½Π΅Ρ Π»ΡΠ±ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΎΠ½ΠΈ Π²ΡΠ΅ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅) Console.WriteLine(mostOften);
(gives the ΠΊΠΎΡΠΈΠΊ ).
If you need the most frequent in the two lists, just concatenate them: l1.Concat(l2).GroupBy(...
Update
If you need the most common element in the intersection, everything is not so simple. Intersect collapses replays in lists. Therefore, the correct way, apparently, is:
var l1 = new[] { "Π·Π°ΠΉΡΠΈΠΊ", "ΠΊΠΎΡΠΈΠΊ", "ΠΊΠΎΡΠΈΠΊ", "ΡΠ»ΠΎΠ½ΠΈΠΊ", "Π·Π°ΠΉΡΠΈΠΊ", "ΠΠ°ΡΠΌΠ°Π»Π΅ΠΉ", "Π·Π°ΠΉΡΠΈΠΊ" }; var l2 = new[] { "ΠΊΠΎΡΠΈΠΊ", "ΠΊΠΎΡΠΈΠΊ", "ΡΠ»ΠΎΠ½ΠΈΠΊ", "Π·Π°ΠΉΡΠΈΠΊ", "ΠΠ°ΡΠΌΠ°Π»Π΅ΠΉ", "ΡΠΆΠΈΠΊ" }; // ΡΡΠΈΡΠ°Π΅ΠΌ, ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ var firstCount = l1.GroupBy(s => s) // Π³ΡΡΠΏΠΏΠΈΡΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ .ToDictionary(g => g.Key, g => g.Count()); var result = // Π³ΡΡΠΏΠΏΠΈΡΡΠ΅ΠΌ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ l2.GroupBy(s => s) // Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ .Select(g => new { Value = g.First(), SecondCount = g.Count() }) // ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΡ
Π½Π΅Ρ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠΏΠΈΡΠΊΠ΅ .Where(vc => firstCount.ContainsKey(vc.Value)) // Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½Π° ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΏΠΈΡΠΊΠΎΠ² .Select(vc => new { vc.Value, Count = Math.Min(vc.SecondCount, firstCount[vc.Value]) }) // ΡΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΏΠΎ ΡΠ±ΡΠ²Π°Π½ΠΈΡ .OrderByDescending(vc => vc.Count) // ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ - Ρ ΡΠ°ΠΌΡΠΌ Π±ΠΎΠ»ΡΡΠΈΠΌ Count .First() // Π±Π΅ΡΡΠΌ ΠΈΠ· Π½Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ .Value; Console.WriteLine(result);
( ΠΊΠΎΡΠΈΠΊ again)
Update
More elegant solution (suitable for the modified condition):
var lookup1 = l1.ToLookup(s => s); var lookup2 = l2.ToLookup(s => s); var result = l1.Intersect(l2) .ToDictionary(v => v, v => Math.Min(lookup1[v].Count(), lookup2[v].Count())); foreach (var kv in result) { Console.WriteLine($"Item {kv.Key} occurs {kv.Value} times"); }