Est-il LINQ fonction pour obtenir la plus longue chaîne dans une liste de chaînes de caractères?
Est-il un LINQ
fonction de ce qui est ou serait-on coder eux-mêmes comme ceci:
static string GetLongestStringInList()
{
string longest = list[0];
foreach (string s in list)
{
if (s.Length > longest.Length)
{
longest = s;
}
}
return longest;
}
- Ce résultat aimez-vous s'il y a deux chaînes qui partage la plus longue longueur?
Vous devez vous connecter pour publier un commentaire.
Cela va le faire avec une seule itération de boucle:
3.26 seconds
et votre réponse a été0.36 seconds
. Ce fut une moyenne de 15 pistes pour chaque méthode. J'avais oublié tous au sujet de la somme de la méthode d'extension! 🙂Aggregate
fonction est tellement simple, et pourtant il est le seul résout donc de nombreux problèmes intéressants!reduce
oufold
dans d'autres langues (en.wikipedia.org/wiki/Fold_(plus-order_function))Vous pouvez utiliser ceci:
list.OrderByDescending(s => s.Length).First();
FirstOrDefault
en cas de tableau est vide pour éviter une erreur.FirstOrDefault
donner le mauvais résultat si le tableau est vide? Il serait de retour la valeur par défaut, mais nous nous attendons à ce null si le tableau est vide. J'ai aussi entendu dire queFirstOrDefault
doivent être évités en raison de la performance des frais générauxif
?First
sur unstring[] list = new string[0];
linq lèvera une exception dans le cas oùFirstOrDefault
retournera null sans lancer une exception. En général, je me retrouve à l'aide deFirstOrDefault
et en vérifiant le résultat courant après l'appel. Si vous êtes dans une situation où vous pouvez garantir la liste des toujours a au moins un élément,First
est ok, mais si jamais vous avez un doute (telles que la sélection d'attributs en XML), puis-je utiliserFirstOrDefault
.Single
vsFirst
, la différence étant queSingle
vérifie toujours tous les éléments etFirst
les courts-circuits sur le premier élément. Mais la seule différence importante entreFirst
etFirstOrDefault
est la fonctionnalité.First()
est appelé). SimonC de la solution, en revanche, est O(n).La méthode que vous souhaitez est généralement appelé "MaxBy" et il n'est malheureusement pas inclus dans l'ensemble de la séquence d'opérateurs. Heureusement, il est très facile d'écrire vous-même. Voir cette réponse pour une mise en œuvre:
Linq groupe avec une sous-requête
MaxBy
semble cassé. Lefunc
argument n'a jamais été utilisé. J'ai proposé une modification de la réponse à ce que je pense que c'est l'intention de le faire (c'est à dire utiliserfunc
pour sélectionner la valeur en cours de comparaison).Ajouter un ThenBy() pour garantir un ordre de retour si il y a plusieurs chaînes de caractères avec la même longueur
D'obtenir la plus longue chaîne dans la liste de l'objet/string essayez ceci:
La variable
maxString
contiendra la valeur"HELLO WORLD"