2009-11-25 4 views
0

Je me suis retrouvé dans une situation où je dois comparer deux listes différentes et je me demande quelle est la meilleure méthode pour cela? Je pensais que quelque chose comme ça marcherait mais ça ne fonctionne pas et je ne comprends pas pourquoi. La requête Linq renvoie des enregistrements qu'elle ne devrait pas. C'est la première fois que j'essaie de trouver quelque chose comme ça, donc c'est sans doute en désordre.C# Comparaison de deux listes personnalisées

private static List<ColumnDefinition> FindTableStructureUpdates(List<ColumnDefinition> colDefs, List<ColumnDefinition> tblCols) 
    { 
     List<ColumnDefinition> ColsToUpdate = new List<ColumnDefinition>(); 

     for (int i = 0; i < colDefs.Count; ++i) 
     { 
      string colDefName = colDefs[i].ColName; 
      string colDefDataType = colDefs[i].ColType; 
      string colDefAttribute = colDefs[i].ColAttributes; 

      var query = from tbl in tblCols 
         where tbl.ColName != colDefName && tbl.ColType != colDefDataType && tbl.ColAttributes != colDefAttribute 
         select new { colDefName, colDefDataType, colDefAttribute }; 

      if (query.Count() > 0) 
      { 
       foreach (var item in query) 
       { 
        ColsToUpdate.Add(new ColumnDefinition(item.colDefName, item.colDefDataType, item.colDefAttribute)); 
       } 
      } 
     } 

     return ColsToUpdate; 

Toutes les suggestions seraient grandes.

Merci.

Implémentation corrigible?

#region IEquatable<ColumnDefinition> Members 

    public bool Equals(ColumnDefinition other) 
    { 
     if (this.ColName.Equals(other.ColName) && this.ColType.Equals(other.ColType) && this.ColAttributes.Equals(other.ColAttributes)) 
      return true; 

     return false; 
    } 
+0

Qu'est-ce que vous essayez d'atteindre exactement? – Manu

+0

J'ai une base de données SQLite back end et j'essaye d'écrire une méthode pour comparer ce que la structure de table actuelle est à ce que j'ai codé dans une autre méthode si je fais une mise à jour de la table physique. Je ne pouvais pas penser à un moyen plus facile de le faire. – Nathan

+0

Seulement une liste de "mise à jour"? Aucune liste pour "ajouté" et "supprimé"? Cela signifie-t-il que nous pouvons supposer que les deux listes contiennent toujours le même nombre d'éléments? –

Répondre

2

Vous ne pouvez pas utiliser Enumerable.Except?

public static IEnumerable<TSource> Except<TSource>(
    this IEnumerable<TSource> first, 
    IEnumerable<TSource> second 
) 

Plus details.

Un exemple testé dans Snippet Compiler

using System; 
using System.Linq; 
using System.Collections.Generic; 

class ColumnDefinition : IEquatable<ColumnDefinition> 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public string Attr { get; set; } 

    public ColumnDefinition() 
    { 
     Name = string.Empty; 
     Type = string.Empty; 
     Attr = string.Empty; 
    } 

    public bool Equals(ColumnDefinition other) 
    { 
     return Name.Equals(other.Name) && Type.Equals(other.Type) && Attr.Equals(other.Attr); 
    } 

    public override bool Equals(object value) 
    { 
     return (value is ColumnDefinition) ? Equals(value as ColumnDefinition) : false; 
    } 

    public override int GetHashCode() 
    { 
     return Name.GetHashCode()^Type.GetHashCode()^Attr.GetHashCode(); 
    } 

    public override string ToString() 
    { 
     return string.Concat("{", Name, ":", Type, ":", Attr, "}"); 
    } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     try 
     { 
      MyMain(args); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
     finally 
     { 
      Console.ReadKey(); 
     } 
    } 

    public static void MyMain(string[] args) 
    { 
     var list1 = new [] 
      { 
       new ColumnDefinition { Name = "foo", Type = "int", Attr = "0" }, 
       new ColumnDefinition { Name = "bar", Type = "int", Attr = "1" }, 
      }; 

     var list2 = new [] 
      { 
       new ColumnDefinition { Name = "foo", Type = "int", Attr = "0" }, 
       new ColumnDefinition { Name = "bar", Type = "string", Attr = "1" }, 
      }; 

     foreach (var changed in Enumerable.Except(list1, list2)) 
     { 
      Console.WriteLine(changed); 
     } 
    } 
} 
+0

Je lui ai donné un coup de feu mais il renvoie des enregistrements quand il ne devrait rien retourner dans mon test. – Nathan

+0

Avez-vous implémenté un comparateur d'égalité approprié pour votre classe ColumnDefinition? Sinon, faites s'il vous plaît. Les fonctions Enumerable.Except/Intersect/Union en dépendent. – typeseven

+0

Oh, je n'ai jamais fait ça avant. Je vais essayer et voir ce que je viens avec. Merci! – Nathan