2010-08-04 5 views
2

Disons que j'ai 4 tableaux:Trouver un objet correspond de tableaux

[1,3,54,4] 
[54,2,3,9] 
[3,2,9,54] 
[54,8,4,3] 

Je dois obtenir les objets (dans ce entiers de cas, mais ils seront objet sur mesure) qui sont présents dans (commun à) tous les tableaux. Dans le cas ci-dessus, il faudrait que le résultat soit: [54,3] car ce sont les seuls éléments qui sont dans les quatre tableaux. L'ordre n'a pas d'importance, la vitesse est très importante, la taille des baies et le nombre de baies varient considérablement. J'utilise C# 4 et ASP.NET. Les tableaux seront Liste bien qu'ils pourraient juste être convertis.

Merci :)

Répondre

6

Que diriez-vous:

ISet<int> intersection = new HashSet<int>(firstArray); 
intersection.IntersectWith(secondArray); 
intersection.IntersectWith(thirdArray); 
intersection.IntersectWith(fourthArray); 

Notez que cela devrait être plus efficace que la plus évidente:

var x = firstArray.Intersect(secondArray) 
        .Intersect(thirdArray) 
        .Intersect(fourthArray); 

que celui-ci va créer un nouveau jeu de hachage pour chaque appel de méthode.

Évidemment, avec plusieurs matrices, vous devez simplement boucler, par ex.

static ISet<T> IntersectAll<T>(IEnumerable<IEnumerable<T>> collections) 
{ 
    using (IEnumerator<T> iterator = collections.GetEnumerator()) 
    { 
     if (!iterator.MoveNext()) 
     { 
      return new HashSet<T>(); 
     } 
     HashSet<T> items = new HashSet<T>(iterator.Current); 
     while (iterator.MoveNext()) 
     { 
      items.IntersectWith(iterator.Current); 
     } 
     return items; 
    } 
} 
+0

EDIT: Merci pour la réponse rapide! Regarde exactement ce que je veux. Merci pour l'effort, et la création du dernier exemple :) – Matt

Questions connexes