2010-09-16 8 views
1

J'ai une petite structure et je dois comparer les valeurs pour trouver celles qui ont le même texte FreeFlow, puis saisir cette struct ENumber.Comment comparer deux listes struct?

public struct Holder 
    { 
     public string FreeFlow; 
     public int ENumber; 
    } 

et voici comment je les ajoute

foreach(Class1.TextElement re in Class1._TextElements) 
      { 
       //create struct with all details will be good for later 
       Holder ph = new Holder(); 
       ph.FreeFlow = re.FreeFlow; 
       ph.ENumber = re.ENumber; 
       lstHolder.Add(ph); 
      } 

     foreach(Class1.TextElement2 re in Class1._TextElements2) 
      { 
       //create struct with all details will be good for later 
       Holder phi = new Holder(); 
       phi.FreeFlow = re.FreeFlow; 
       phi.ENumber = re.ENumber; 
       lstHolder2.Add(phi); 
      } 

Je peux faire la comparaison en utilisant un foreach dans un foreach, mais je pense que ce ne sera pas la façon la plus efficace. De l'aide?

EDIT: Je suis en train de déterminer si le texte est FreeFlow exactement la même chose que l'autre texte struct FreeFlow

+2

Tout d'abord, vous devriez en faire une classe au lieu d'une structure. Implémenter une structure correctement est plus compliqué que d'implémenter une classe correctement. – Guffa

Répondre

2

Je dois comparer les valeurs pour trouver ceux qui ont le même texte FreeFlow , puis saisir cette struct ENumber.

Si vous pouvez utiliser LINQ vous pouvez joindre les éléments avec le même texte FreeFlow puis sélectionnez les valeurs ENumber des deux éléments:

var query = from x in Class1._TextElements 
      join y in Class1._TextElements2 on x.FreeFlow equals y.FreeFlow 
      select new { xId = x.ENumber, yId = y.ENumber }; 

foreach (var item in query) 
{ 
    Console.WriteLine("{0} : {1}", item.xId, item.yId); 
} 

EDIT: je crois comprendre le texte FreeFlow est le membre commun et que ENumber est probablement différent, sinon il serait logique de déterminer l'équivalence sur cette base. Si tel est le cas, la requête join ci-dessus devrait être ce dont vous avez besoin.

0

Que voulez-vous dire par « comparer »? Cela pourrait signifier beaucoup de choses. Voulez-vous savoir quels éléments sont communs aux deux ensembles? Voulez-vous savoir quels éléments sont différents?

LINQ pourrait avoir la réponse, peu importe ce que vous voulez dire. Union, Sauf, etc.

+0

Je veux savoir quel texte de flux libre sont les mêmes entre les ensembles, puis saisir les deux nombres pour chaque structure – Spooks

0

Si vous utilisez C# 3.0 ou supérieur essayez la méthode SequenceEqual

Class1._TextElements.SequenceEquals(Class1._TextElements2); 

Cela exécutera des contrôles à l'égalité sur les éléments de la collection. Si les séquences ont des longueurs différentes ou si l'un des éléments dans la même position n'est pas égal, il retournera faux.

+0

ne pas utiliser C# 3.0 ou supérieur sur ce projet :( – Spooks

1

Si je vous interprète correctement, vous voulez trouver les éléments qui se trouvent dans à la fois lstHolder et lstHolder2 - qui est l'intersection. Si j'interprète correctement, alors la solution en deux étapes: d'abord, remplacez Equals() sur votre struct Holder. puis utilisez Teh LINQ Intersection opérateur:

var result = lstHolder.Intersect(lstHolder2);