J'ai une List , 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 , 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",
};
3 Réponses :
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)
});
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
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).
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:
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