2017-06-27 4 views
-2

Je fais un except de deux DataTables en . J'ai surchargée le IEqualityComparerMéthode la plus rapide ou alternative de compter des éléments dans un nombre de type personnalisé en C#

public bool Equals(T sourceRec, T targetRec) 
    { 
     string srcHash, tgtHash; 
     srcHash = HashGenerator.GenerateHash<T>(sourceRec); 
     tgtHash = HashGenerator.GenerateHash<T>(targetRec); 
     return srcHash.Equals(tgtHash); 
    } 

    public int GetHashCode(T obj) 
    { 
     return base.GetHashCode(); 
    } 

et sauf travaillera en tenant compte de la valeur de hachage de chaque DataRow. RowHashComparer est une propriété utilisée pour effectuer des personnalisations, sauf en comparant les codes de hachage. Ce que j'ai trouvé est la comparaison d'égalité qui se passe réellement après que la méthode Except est retournée.

Veuillez nous suggérer.

+0

au lieu de retourner un 'Enumerable', vous pouvez retourner un' HashSet <> '. – Rob

+3

J'ai un sac plein de billes, je veux savoir combien de billes j'ai. Pouvez-vous me dire un moyen qui ne consiste pas * à les compter un par un? Eh bien, non, pas vraiment. Peut-être que vous devriez prendre du recul et vous demander si un sac est ce dont vous avez vraiment besoin. Est-ce qu'un autre type de collection fait un meilleur travail? – InBetween

+1

@InEntre - l'argent peut être compté en le pondérant. Les billes normalisées dans un sac de poids connu peuvent être comptées avec une balance. – Moho

Répondre

-3

forme la plus simple serait:

public static int Count(this IEnumerable source) 
{ 
    int c = 0; 
    using (var e = source.GetEnumerator()) 
    { 
     while (e.MoveNext()) 
      c++; 
    } 
    return c; 
} 

nous pouvons améliorer ce en questionnant pour ICollection:

public static int Count(this IEnumerable source) 
{ 
    var col = source as ICollection; 
    if (col != null) 
     return col.Count; 

    int c = 0; 
    using (var e = source.GetEnumerator()) 
    { 
     while (e.MoveNext()) 
      c++; 
    } 
    return c; 
} 
+2

Et cela améliore 'Enumerable.Count (cette source IEnumerable )' exactement comment? – InBetween

+1

@Rohit - vérifier le dernier sucre syntaxique en C#: si (source est ICollection col) { return col.Count; } – Moho

+0

@Moho Merci pour votre suggestion .. je travaille dessus. –