można użyć Dictionary<string, int>
, klucz jest ciągiem i wartością jest liczba:
Dictionary<string, int> itemCounts = new Dictionary<string,int>();
for(int i = 0; i < stringLists.Length; i++)
{
List<string> list = stringLists[i];
foreach(string str in list.Distinct())
{
if(itemCounts.ContainsKey(str))
itemCounts[str] += 1;
else
itemCounts.Add(str, 1);
}
}
var result = itemCounts.Where(kv => kv.Value >= 2);
Używam list.Distinct()
, ponieważ chcesz tylko liczyć wystąpienia na różnych listach.
Zgodnie z wnioskiem, o to metoda rozszerzenie, które można ponownie wykorzystać z dowolnym typem:
public static IEnumerable<T> GetItemsWhichOccurAtLeastIn<T>(this IEnumerable<IEnumerable<T>> seq, int minCount, IEqualityComparer<T> comparer = null)
{
if (comparer == null) comparer = EqualityComparer<T>.Default;
Dictionary<T, int> itemCounts = new Dictionary<T, int>(comparer);
foreach (IEnumerable<T> subSeq in seq)
{
foreach (T x in subSeq.Distinct(comparer))
{
if (itemCounts.ContainsKey(x))
itemCounts[x] += 1;
else
itemCounts.Add(x, 1);
}
}
foreach(var kv in itemCounts.Where(kv => kv.Value >= minCount))
yield return kv.Key;
}
użycia jest prosty:
string result = String.Join(",", stringLists.GetItemsWhichOccurAtLeastIn(2)); // a,b,c,d
Możesz zacząć [tutaj] (http: // stackoverflow. com/questions/12584179/check-for-any-element-that-exist-in-two-collections) i zmodyfikuj go, aby użyć trzeciej kolekcji. –
Można użyć 'SelectMany', aby utworzyć pojedynczą listę ze wszystkich list, a następnie wybrać wszystkie elementy z co najmniej 2 wystąpieniami. – LInsoDeTeh
czy możliwe są duplikaty na listach? mam na myśli, że lista może zawierać nową listę() {"a", "a", "a"}? –