C# Génériques De La Liste D'Union De La Question
Je suis en train de fusionner les 2 listes à l'aide de "l'Union" j'ai donc éliminer les doublons. Voici un exemple de code:
public class SomeDetail
{
public string SomeValue1 { get; set; }
public string SomeValue2 { get; set; }
public string SomeDate { get; set; }
}
public class SomeDetailComparer : IEqualityComparer<SomeDetail>
{
bool IEqualityComparer<SomeDetail>.Equals(SomeDetail x, SomeDetail y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y))
return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
return x.SomeValue1 == y.SomeValue1 && x.SomeValue2 == y.SomeValue2;
}
int IEqualityComparer<SomeDetail>.GetHashCode(SomeDetail obj)
{
return obj.SomeValue1.GetHashCode();
}
}
List<SomeDetail> tempList1 = new List<SomeDetail>();
List<SomeDetail> tempList2 = new List<SomeDetail>();
List<SomeDetail> detailList = tempList1.Union(tempList2, SomeDetailComparer).ToList();
Maintenant, la question est puis-je utiliser de l'Union et toujours obtenir l'enregistrement qui est la date la plus récente (à l'aide de SomeDate de la propriété). L'enregistrement lui-même peut être soit tempList1 ou tempList2.
Merci d'avance
OriginalL'auteur Ganesha | 2009-05-11
Vous devez vous connecter pour publier un commentaire.
L'opération qui est vraiment adapté à ce but, est un jointure externe complète. Le
Enumerable
de classe a d'une mise en œuvre de la jointure interne, que vous pouvez utiliser pour trouver les doublons et sélectionnez celui que vous préférez.keySelector
est simplement une fonction (qui peut être une expression lambda) qui extrait une clé à partir d'un objet de typeSomeDetail
. Maintenant, pour mettre en œuvre la jointure externe complète, essayez quelque chose comme ceci:equalityComparer
doit être un objet qui implémenteIEqualityComparer<SomeDetail>
et utilise efficacement lekeyComparer
fonction pour tester l'égalité.Laissez-moi savoir si ce n'est le travail pour vous.
Avez-vous vérifié qu'il n'y au moins certains des éléments identiques UniqueKey valeurs?
Oh! Les listes pourraient avoir totalement différentes valeurs. Si il est une valeur correspondante puis, la date doit être pris en compte pour décider qui sera choisi Si il n'y a pas de valeur correspondante, la valeur sera toujours copié. (tout comme dans le cas de l'Union)
Bien dans votre question initiale que vous comparez des articles basés sur l'expression
x.SomeValue1 == y.SomeValue1 && x.SomeValue2 == y.SomeValue2
. Cela signifierait que vous souhaitez sélectionner un n-uplet de SomeValue1 et SomeValue2 comme la clé. (En C#, la meilleure option est probablement d'utiliser les types anonymes. Je vais mettre à jour ma réponse avec le code).Le nouveau code avec la touche de comparer ne renvoie aucun enregistrement? Toute aide, s'il vous plaît?
OriginalL'auteur Noldorin
Vous devriez être en mesure de dire de l'Union de la façon de choisir l'une des doublons à utiliser. Je ne sais pas de manière à faire d'autre que de la rédaction de votre Union.
OriginalL'auteur John Weldon
Vous ne pouvez pas à la norme
Union
méthode, mais vous pouvez créer une méthode d'extensionUnion
pourList<SomeDetail>
avec cette manutention spéciale et cette méthode sera utilisée parce que la signature correspond le mieux.OriginalL'auteur Daniel Brückner
Pourquoi ne pas simplement utiliser le HashSet<T>?
OriginalL'auteur Chris Doggett
De fusion générique listes
OriginalL'auteur Michael D. Irizarry
essayez ceci:
OriginalL'auteur Adem Aygun