7
votes

Fusionner et mettre à jour deux listes dans C #

J'ai deux Liste objets:

Par exemple:

Liste 1:

ID, valeur où l'identifiant est peuplé et la valeur est vide et contient des identifiants de 1 à 10.
1, ""
2, "
...
10, ""

Liste 2:
ID, valeur et autres attributs remplis de valeurs mais cette liste est un sous-ensemble de la liste 1 en termes d'identifiants. (E.g seulement 3 articles)
2,67
4,90
5,98

Ce que je veux, c'est une liste fusionnée 1, mais avec des valeurs mises à jour. Est-ce que quelqu'un a une bonne méthode d'extension qui fera cela ou tout code élégant pour effectuer cette opération. La liste finale devrait être:

ID, valeur
1, ""
2,67 // Valeur de la liste 2
3, "
4,90
5,98
6, ""
...
10, ""


1 commentaires

Votre valeur une chaîne ou un int? Vous semble montrer des chaînes dans la liste 1 alors que l'INT dans la liste 2.


6 Réponses :


3
votes

Ceci est o (m * n) mais devrait faire le travail pour les listes arbitraires xxx

si les listes sont garanties, alors elle pourrait être amenée à O (n) à la Coût de plus de code. L'algortihm serait xxx


0 commentaires

3
votes

Je voudrais probablement utiliser un dictionnaire plutôt qu'une liste: xxx

Si vous parlez de propriétés d'un objet, il sera plus délicat, mais toujours difficile .


0 commentaires

0
votes

Si vous avez les deux listes triés par ID , vous pouvez utiliser une variation de l'algorithme de fusion classique: xxx

Notez que cela nécessite également list2 Pour être un sous-ensemble strict de list1 en termes d'id (c.-à-d. list1 contient vraiment tous les identifiants de list2 )

Bien sûr, vous pouvez également envelopper cela dans une méthode d'extension xxx


0 commentaires

9
votes

Utiliser LINQ: LIST1 = LIST2.UNION (LISTE1);


2 commentaires

J'ai essayé votre code avec deux listes de type Liste <étudiant> L'étudiant de la classe ressemble à ceci étudiant étudiant = nouvel étudiant () {id = 1, nom = "foo"} Utilisation de cette syntaxe list1 = list2.toliste (). Union (list1.toliste ()). Tolist (); mais il n'a pas fusionné les deux listes; Il suffit de les coller ensemble comme un Union -See exemple 3 . Êtes-vous sûr qu'il fusionne la liste avec des valeurs mises à jour ?


J'ai trouvé cette question sur la façon de Supprimer les duplicats pendant la fusion des listes et cela confirme que votre code ne fonctionne que si la classe dépasse gethascode () et égale ()



0
votes
 private void btnSearch_Click(object sender, EventArgs e)
{
String searchBy = cmbSearchBy.Text.ToString();
String searchFor = txtSearchFor.Text.Trim();

var List3 = (from row in JobTitleDB.jobList
                         where (row.JID.ToString()+row.JobTitleName.ToString().ToLower()).Contains(searchFor.ToLower())
                         select row).ToList();
if (searchBy == "All")
            {
                dgJobTitles.DataSource = null;
                //dgJobTitles.DataSource = List1;
                //dgJobTitles.DataSource = List2;
                //dgJobTitles.DataSource = List1.Concat(List2);
                //dgJobTitles.DataSource = List1.Union(List2);
                dgJobTitles.DataSource = List3;
                //dgJobTitles.DataSource=List1.AddRange(List2);
            }
}

1 commentaires

S'il vous plaît fournir une explication ici. Supprimer le code commenté inutile.



0
votes
Dictionary<int, string> List1 = new Dictionary<int, string>();
List1.Add(1,"");
List1.Add(2,"");
List1.Add(3,"");
List1.Add(4,"");
List1.Add(5,"");
List1.Add(6,"");

Dictionary<int, string> List2 = new Dictionary<int, string>();
List2.Add(2, "two");
List2.Add(4, "four");
List2.Add(6, "six");

var Result = List1.Select(x => new KeyValuePair<int, string>(x.Key, List2.ContainsKey(x.Key) ? List2[x.Key] : x.Value)).ToList();

0 commentaires