2009-08-26 13 views
0

Ich habe ein Array von StringsWie kann ich Elemente erhalten, die gleich string [] sind?

var controlsToGet = new[] {"lblHome","lblContact"}; 

Ich habe List<LanguageControl> und LanguageControl Klasse hält Bedienelemente darin. Ich will Kontrollen von Liste erhalten, die Control.Name == controlsToGet

ich nach etwas suchen, wie die

var all = fooelements.where(l=>l.Control.Name == controlsToGet); 

Ist es möglich, mit Lambda oder Linq.

Hinweis: Ich konnte es mit NHibernate Disjunction tun, ich bin auf der Suche nach so etwas wie diese

EDIT: Was würde ich tun, wenn diese Abfrage für Datenbank mit dem Entity verwenden möge Rahmen?

Danke

Antwort

10
var all = fooelements 
       .Where(l=>controlsToGet 
          .Contains(l.Control.Name)); 

Wenn jedes Element eine Liste der Kontrollen hat:

var all = fooelements 
       .SelectMany(l => l.Controls) 
       .Where(c => controlsToGet 
          .Contains(c.Name)); 
+0

Danke, i don Ich habe viel Erfahrung mit Lambdas. Jetzt habe ich den Weg, wie man damit umgehen kann –

+1

I kurz Lambda könnte toll sein, um ... var result = fooelements.FindAll (item => controlsToGet.Contains (item.Name)); –

+2

Ich habe nichts gegen den Verlust der Reputation, aber ich wünschte, wer auch immer downvoted hat einen Kommentar gepostet. Ich wäre daran interessiert, zu wissen, was mit dieser Antwort falsch war, auch wenn es nur dazu diente, mich zu erziehen ... –

1
var all = from control in listofcontrols 
      from toGet in controlsToGet 
      where toGet == control.name 
      select control; 
2

Wenn controlsToGet ein String ist, wird diese Arbeit:

var all = fooelements.SelectMany(l => l.Controls).Where(c => c.Name == controlsToGet); 

Wenn es jedoch ein List<string> ist benötigen Sie:

var all = fooelements.SelectMany(l => l.Controls).Where(c => controlsToGet.Contains(c.Name)); 
3

Sie könnten auch die findall verwenden. Wenn Microsoft das Verfahren optimieren Sie die Leistung steigern, wenn nicht wird es sein, ist die gleiche wie die foreach

var result = fooelements.FindAll(item=> controlsToGet.Contains(item.Name)); 
1

Eine naive Lösung wie:

fooelements.SelectMany(l => l.Controls).Where(c => controlsToGet.Contains(c.Name)) 

ist O (n * m) wo n ist die Anzahl der Steuerelemente und m ist die Anzahl der Zeichenfolgen in Ihrem Namen Array. Manche mögen argumentieren, dass dies Erbsenzählerei und YAGNI und ... (bla bla), aber was zum Teufel - nur ein wenig mehr Code gibt Ihnen einen O (n) Lösung:

var controlsToGet = new HashSet<string> { "lblHome", "lblContact" }; 
var controls = fooelements.SelectMany(l => l.Controls) 
    .Where(c => controlsToGet.Contains(c.Name)) 
+0

Guter Punkt. Unter der Annahme, dass es genug Vergleiche gibt, um die anfänglichen Kosten der Hashes zu überwinden, sollte dies eine schnellere Lösung sein. –

+0

Ja, der Hauptpunkt ist, dass Sie eine Leistungsabhängigkeit von der Anzahl der Kontrollnamen beseitigt haben (die sich zweifellos ändern werden). –

Verwandte Themen