2
votes

Prenez des enregistrements uniques à partir d'un fichier texte à l'aide de LINQ

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 :


2
votes

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();


5 commentaires

@ 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 :)



1
votes

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();


3 commentaires

MoreLinq - c'est le pack NuGet?


Oui, vous pouvez le trouver sur Nuget


besoin de tester d'abord les autres réponses :)



1
votes

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)));


0 commentaires