9
votes

C # foreach seulement obtenir des valeurs distinctes

J'ai le code suivant:

foreach (Logs log in _logsDutyStatusChange)
{
    string driverid = log.did;
}

c#

0 commentaires

8 Réponses :


1
votes

Premièrement, créez une classe de comparaison et implémentez l'interface IequalityComParer

puis utilisez la surcharge du énumérable.distinct ( ) méthode qui prend une instance du comparateur d'égalité: xxx


0 commentaires

6
votes

MHH ... peut-être utiliser ienumerable 's distinct () fonction?


2 commentaires

+1, mais un exemple serait utile si l'OP ne connaît pas Linq;)


Eh bien ... il semble qu'il y ait des exemples sur cette page;)



13
votes

Vous devriez faire:

foreach (string id in _logsDutyStatusChange.Select(x=>x.did).Distinct())
{
    string driverid = id;
}


3 commentaires

Peut aussi bien utiliser dernier après le distinct et renverser le foreach


@JuHarr: Je pense qu'il est raisonnable de supposer qu'il y a vraiment plus de code qu'une déclaration variable dans le corps de la boucle.


Eh bien, je n'étais pas sûr s'il fait autre chose avec l'identifiant de la boucle, si je comprends, c'est juste un échantillon qu'il a affiché.



0
votes

Vous pouvez utiliser distinct si votre classe de journaux implémente IQUABLETABLE

Sinon, un «hacky» rapide peut être d'utiliser quelque chose comme P>

foreach (var group in _logsDutyStatusChange.GroupBy(l => new { log.did, .... more identifying fields })
{
    string driverid = group.Key.did;
}


0 commentaires

5
votes

Votre code n'ajoute rien maintenant, il s'agit simplement de définir une chaîne (déclarée dans la portée de la boucle) à chaque valeur. Le résultat final serait que la dernière valeur, et il serait hors de portée du code suivant de toute façon. Si vous essayez de les ajouter à une chaîne, séparées par des virgules, par exemple, essayez ceci:

string driverids = string.Join(",", _logsDutyStatusChange
  .Select(item=>item.did)
  .Distinct()
  .ToArray());


0 commentaires

1
votes

au lieu de Foreach'ing'ing'ing'ing'ing'ing'ing'ing'ing'servy, vous pouvez utiliser Linq pour obtenir une collection de distincte et de boucle à travers celles-ci, à la place:

foreach (Logs log in _logsDutyStatusChange.Select(l => l.did).Distinct())
{
    //Handling code here
}


0 commentaires

0
votes

Voici une approche: xxx

distinct () ne fonctionne pas tout à fait ici, car il ne vous obtiendra que le "code> distinct" / code > s.


0 commentaires

3
votes

Cela devrait fonctionner (sans linq):

Hashset<string> alreadyEncountered = new Hashset<string>();
foreach (Logs log in _logsDutyStatusChange)
{
    if(alreadyEncountered.Contains(log.did))
    {
        continue;
    }
    string driverid = log.did;
    alreadyEncountered.Add(driverid);
}


0 commentaires