J'ai configuré la liste ICollection
:
2019-03-03|1|LN1|FN1|Berlin 2019-03-03|2|LN2|FN2|Rome 2019-03-03|3|LN3|FN3|Wien 2019-03-03|4|LN4|FN4|Londyn .... 2019-03-27|1|LN1|FN1|Berlin 2019-03-27|2|LN2|FN2|Rome 2019-03-27|3|LN3|FN3|Wien 2019-03-27|4|LN4|FN4|Londyn
Mon fichier texte source se présente comme suit:
public ICollection<User> MyUsers { get; set; } public IList<User> GetUserList(string path) { MyUsers = File.ReadAllLines(path) .Where(linia => linia.Length > 1) .Select(line => Parse(line)) .ToList(); return new List<User>(MyUsers); } private static User Parse(string line) { var column = line.Split('|'); return new User { ReadTime = column [0], idUser = column [1], LastName = column [2], FirstName = column [3], City = column[4] }; }
3 Réponses :
Vous pouvez essayer avec la méthode GroupBy
simple:
MyUsers = File.ReadAllLines(path) .Where(linia => linia.Length > 1) .Select(line => Parse(line)) .GroupBy( u => u.idUser, (key, grp) => new User() { ReadTime = grp.Select(u => u.ReadTime).Max(), idUser = key, LastName = grp.Select(u => u.LastName).FirstOrDefault(), FirstName = grp.Select(u => u.FirstName).FirstOrDefault(), City = grp.Select(u => u.City).FirstOrDefault(), }) .ToList();
@ 4est Placez simplement le code après avoir utilisé la méthode Parse
vous avez deux fois ToList ()
, veuillez d'abord supprimer ..... mais j'ai testé et fonctionne très bien, merci!
@ 4est Ensuite, vous devez accepter la réponse (coche verte à gauche) et éventuellement voter pour.
J'accepterai, bien sûr, mais veuillez d'abord supprimer ToList ()
, merci
Merci pour la rapidité d'exécution :)
Vous pouvez utiliser MoreLINQ -NuGet-package, il est utile DistinctBy -fonction:
MyUsers = File.ReadAllLines(path) .Where(linia => linia.Length > 1) .Select(line => Parse(line)) .OrderByDescending(r => r.ReadTime) .DistinctBy(r => new { r.City, r.FirstName, r.idUser, r.LastName }) .ToList();
MoreLinq - c'est le pack NuGet?
Oui, vous pouvez le trouver sur Nuget
besoin de tester d'abord les autres réponses :)
Nous pouvons GroupBy
et trouver la date Max
pour chaque groupe:
MyUsers = result .Select(line => Parse(line)) .ToList();
Après avoir filtré les doublons, nous pouvons ensuite les analyser dans une collection :
IEnumerable<string> result = File .ReadLines(path) .Where(line => !string.IsNullOrWhiteSpace(line)) // to be on the safe side .Select(line => { int p = line.IndexOf('|'); return new { date = line.Substring(0, p), // date to take Max key = line.Substring(p + 1) // group key }; }) .GroupBy(item => item.key, item => item.date) .Select(chunk => string.Join("|", chunk.Key, chunk.Max(item => item)));
regardez ce stackoverflow.com/questions/16076805/linq-distinct-max