2009-08-05 19 views
3

Wie soll ich das in .NET 2.0 verwenden?LINQ in .NET 2.0 konvertieren

[DataObjectMethod(DataObjectMethodType.Select)] 
public IEnumerable<OperatorField> FindByType(String type) 
{ 
    // return only selected type 
    return (from ce in this.OperatorFields where ce.Type == type select ce).ToList(); 
} 

Ich benutze dies in einem 3,5-Projekten, aber jetzt bin ich das Hinzufügen neuer Funktionalität zu einem alten Projekt, das kann ich nicht (zu diesem Zeitpunkt) auf 3,5 aktualisieren.


Ich habe gerade dies:

[DataObjectMethod(DataObjectMethodType.Select)] 
public IEnumerable<OperatorField> FindByType(String type) 
{ 
    // return only selected type 
    //return (from ce in this.OperatorFields where ce.Type == type select ce).ToList(); 

    List<OperatorField> r = new List<OperatorField>(); 

    foreach (OperatorField f in this.OperatorFields) 
     if (f.Type == type) 
      r.Add(f); 

    return r; 
} 
+0

Wenn Sie einen Blick auf die IL nehmen, gibt es wirklich einen Unterschied? Kannst du die Perf von beiden messen und sehen, ob der eine oder der andere schneller ist? – StingyJack

+0

2 min und 4 identische Antworten :) – cwap

+0

@StingyJack: Die IL wird überhaupt nicht ähnlich sein, da die linq-Version Aufrufe an 'System.Linq.Enumerable.Where()', 'System.Linq.Enumerable haben wird. Wählen Sie() 'und' System.Linq.Enumerable.ToList() ', während die andere Version' IEnumerable.GetEnumerator() 'aufruft und das Ergebnis iteriert. –

Antwort

12

Können Sie sich noch C verwenden # 3.0, aber nicht .NET 3.5? Ist dies der Fall, behalten Sie den Code so, wie er ist, und verwenden Sie LINQBridge, was LINQ to Objects für .NET 2.0 ist.

Andernfalls, dies tun:

[DataObjectMethod(DataObjectMethodType.Select)] 
public IEnumerable<OperatorField> FindByType(String type) 
{ 
    List<OperatorField> list = new List<OperatorField>(); 
    foreach (OperatorField ce in OperatorFields) 
    { 
     if (ce.Type == type) 
     { 
      list.Add(ce); 
     } 
    } 
    return list; 
} 
+0

2.0 nur :(zumindest bis zur nächsten Version, so können wir Kunden sagen, dass sie das Framework aktualisieren müssen. Ich füge einfach was ich denke, eine Lösung. – balexandre

+0

+1 für LINQBridge. –

+5

@balexandre: Nein, du verwechselst mich. Sie können die Features von Visual Studio 2008 und C# 3.0 verwenden, aber immer noch auf .NET 2.0 zielen Sie müssen Ihre Clients nicht aktualisieren, damit das Framework funktioniert –

1

So etwas wie diese vielleicht?

IList<OperatorField> col = new List<OperatorField>(); 
foreach (OperatorField f in this.OperatorFields) 
{ 
    if (f.Type == type) 
     col.Add(f); 
} 
return col; 
1
[DataObjectMethod(DataObjectMethodType.Select)] 
public IEnumerable<OperatorField> FindByType(String type) 
{ 
    foreach (OperatorField ce in this.OperatorFields) 
    { 
     if (ce.Type == type) 
      yield return ce; 
    } 
} 
0

Überlegen Sie, was die Aussage zu tun, es ist in der OperatorFields Eigenschaft über jedes Element iteriert, den Typ überprüft und dann das Element in eine Liste, bevor die fertiggestellte Liste zurück.

So haben Sie

bekam
Create new list 
For each item in OperatorFields 
    if item.Type equals type 
    add item to list 

return list