Linq to objects - sélectionnez le premier objet
Je sais presque rien sur linq.
Je suis en train de faire ceci:
var apps = from app in Process.GetProcesses()
where app.ProcessName.Contains( "MyAppName" ) && app.MainWindowHandle != IntPtr.Zero
select app;
Ce qui me fait tous les processus en cours d'exécution qui correspondent à ce critère.
Mais je ne sais pas comment pour obtenir le premier. Les exemples que je peux trouver sur le net semblent impliquer que j'ai à faire ce
var matchedApp = (from app in Process.GetProcesses()
where app.ProcessName.Contains( "MyAppName" ) && app.MainWindowHandle != IntPtr.Zero
select app).First();
ce qui me semble un peu moche, et également lève une exception si il n'y a aucun processus d'appariement. Est-il un meilleur moyen?
Mise à JOUR
Je suis en train d'essayer de trouver le premier élément correspondant, et d'appeler SetForegroundWindow
sur elle
Je suis venu avec cette solution, qui frappe aussi moi aussi laid et affreux, mais c'est mieux que ci-dessus. Des idées?
var unused = from app in Process.GetProcesses()
where app.ProcessName.Contains( "MyAppName" ) && app.MainWindowHandle != IntPtr.Zero
select SetForegroundWindow( app.MainWindowHandle ); //side-effects in linq-query is technically bad I guess
source d'informationauteur Orion Edwards | 2008-08-11
Vous devez vous connecter pour publier un commentaire.
@FryHard FirstOrDefault va fonctionner, mais rappelez-vous qu'il renvoie la valeur null si aucun n'est trouvé. Ce code n'est pas testé mais devrait être proche de ce que vous voulez:
Ne pas utilisation
Count()
comme ICR dit.Count()
va itérer sur lesIEnumerable
de comprendre comment de nombreux éléments dont il dispose. Dans ce cas, les performances peuvent être négligeable, puisqu'il n'y a pas beaucoup de processus, mais c'est une mauvaise habitude à prendre. Utilisez uniquementCount()
lorsque votre requête est seulement intéressé par les nombre de résultats.Count
est presque jamais une bonne idée.Il y a plusieurs problèmes avec FryHard de réponse. Tout d'abord, en raison de retards dans l'exécutionvous aurez l'exécution de la requête LINQ, une fois pour obtenir le nombre de résultats, et une fois à la
FirstOrDefault
. Deuxièmement, il n'y a pas de raison que ce soit, à l'utilisationFirstOrDefault
après vérification de la comte. Car il peut retourner null, vous devriez ne jamais les utiliser sans en vérifier la valeur null. Soit neapps.First().MainWindowHandle
ou:C'est pourquoi la meilleure solution est de Marque, sans se poser de question. C'est la plus efficace et la plus stable de la façon de l'utilisation de LINQ pour obtenir ce que vous voulez.
En supposant que dans votre premier exemple apps est un IEnumerable vous pourriez faire usage de .Le comte et .FirstOrDefault propriétés pour obtenir le seul élément que vous souhaitez passer à SetForegroundWindow.