2
votes

Comment fusionner deux listes différentes

J'ai une List list1 , exemple de valeurs:

name        count
12          0
123         5
1234        20
12345       0

J'ai une classe:

var list2 = new List<TestClass>()
{
    new TestClass() { name = "12", count = 0 },
    new TestClass() { name = "123", count = 5 },
    new TestClass() { name = "1234", count = 20 },
};

et j'ai une List list2 , exemples de valeurs:

public class TestClass {
    public string name{ get; set; }
    public int count{ get; set; }
}

Je veux fusionner list1 et list2 et le résultat doit être:

var list1 = new List<string>()
{
    "123", "1234", "12345",
};

c#

3 commentaires

Avez-vous essayé l ' Union ?


Union ne fonctionnera pas avec des objets personnalisés. Vous devez créer un comparateur personnalisé.


qu'essayez-vous de faire, d'après votre problème, cela ressemble à plus qu'une simple liste, la structure de données devrait être un dictionnaire


3 Réponses :


-1
votes

Vous pouvez essayer d'utiliser linq select avec union .

puis utiliser la propriété GroupBy par nom puis sum

var aaa= list1.Select(x => new TestClass()
{
    name = x.ToString(),
    count = 0
}).Union(list2)
    .GroupBy(x=>x.name)
    .Select(x=>new TestClass()
{
    name = x.Key,
    count = x.Sum(z=>z.count)
});


0 commentaires

-1
votes
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {

        List<TestClass> lst1 = new List<TestClass>();
        lst1.Add(new TestClass(){name="One", count = 1});
        lst1.Add(new TestClass(){name="Two", count = 2});
        lst1.Add(new TestClass(){name="Three", count = 3});

        List<TestClass> lst2 = new List<TestClass>();
        lst2.Add(new TestClass(){name="Four", count = 4});
        lst2.Add(new TestClass(){name="Two", count = 2});
        lst2.Add(new TestClass(){name="Three", count = 3});

        var unionlst = lst1.Union(lst2, new TestClassComparer ());

        foreach(var x in unionlst){
            Console.WriteLine(x.name + ","+x.count);
        }
    }

    class TestClassComparer : IEqualityComparer<TestClass>
    { 
        public bool Equals(TestClass p1, TestClass p2)
        {
            return p1.name == p2.name && p1.count == p2.count;
        }

        public int GetHashCode(TestClass p)
        {
            return p.count;
        }
    }

    public class TestClass {
        public string name{ get; set; }
        public int count{ get; set; }
    }
}
Sample output:One,1Two,2Three,3Four,4

2 commentaires

Avez-vous testé cela? Il ne compile pas.


Ce n'est pas ce que le PO a demandé. Il a donné un échantillon d'entrée et la sortie souhaitée. Vous avez choisi de faire quelque chose de différent (bien que similaire).



5
votes

Cela fonctionne bien:

var list1 = new List<string>()
{
    "123", "1234", "12345",
};

var list2 = new List<TestClass>()
{
    new TestClass() { name = "12", count = 0 },
    new TestClass() { name = "123", count = 5 },
    new TestClass() { name = "1234", count = 20 },
};

var merged =
    list2
        .Concat(list1.Select(x => new TestClass() { name = x, count = 0 }))
        .GroupBy(x => x.name)
        .SelectMany(x => x.Take(1))
        .ToList();

Cela me donne:

merged


0 commentaires