2009-04-24 6 views
0

zusammenstecken Ich habe eine IEnumerable<IDisposable> Sammlung, die ich an einem bestimmten Punkt entsorgen muss. Das Problem besteht darin, dass in einigen Fällen alle Objekte von einem Typ sind und die Entsorgung der Objekte durch Sammlung einiger Daten von ihnen und durch einen einzigen RPC-Aufruf erfolgen muss. In anderen Fällen sind die Objekte von einem anderen Typ und ich muss nur Dispose für jeden von ihnen aufrufen.wie man ein IEnumerable <IDisposable>

Ich kontrolliere den Code dabei, aber ich würde lieber nicht Implementierungsdetails hineinschieben.

Wenn ich muss kann ich zu etwas wie diesem wechseln, aber es scheint unelegant.

with(var rpc = new RPCDisposer()) 
{ 
    foreach (var item in Items) 
    { 
     rpc.Add(item); 
     item.Dispose(); 
    } 
} 

Edit: die Liste (vorerst) nur einen Typ enthalten oder die andere, nie beide. Aber ich würde lieber der Dispose Code nicht über die RPC-Sachen zu bekannten habe überhaupt, ei:

foreach (var item in Items) 
    item.Dispose(); 
+0

Was Sie gebucht haben ist wirklich nicht so schlimm eine Lösung. Ich denke, du suchst nach etwas, das einfach nicht da ist, um ehrlich zu sein. Gehen Sie mit Ihrer anfänglichen Lösung und verwenden Sie möglicherweise LINQ, um es zu vereinfachen, aber das ist alles. – Noldorin

+0

Ich hätte das halb erwartet, aber ich hoffte nur auf etwas Besseres. – BCS

Antwort

3

Wenn dies auf dem Elemente hängt geben, dann können Sie einen Scheck tun, welche Art von Punkt hast du, das Hinzufügen zu RPCDisposer nur diejenigen dieses spezifischen Typs.

using(var rpc = new RPCDisposer()) 
{ 
    foreach (var item in Items) 
    { 
     if (item is RPCItemType) 
      rpc.Add(item); 
     item.Dispose(); 
    } 
} 

Aber noch besser wäre, wenn Sie diese Objekte nicht in der gleichen Liste mischen würden. Könnten Sie Ihren Code umstrukturieren, um ihn in zwei verschiedenen Listen zu speichern?

+0

OTOH Irgendwann werde ich eine gemischte Tasche bekommen (und mehrere RPCs laufen lassen müssen, eins pro Remote-System), also muss ich vielleicht in den sauren Apfel beißen und annehmen, dass der Code die Artikel sortieren muss. – BCS

1

Die OfType Methode könnte Ihnen helfen, die Elemente in zwei Listen zu trennen ...

var rpcItems = items.OfType<RPCItemType>();  
var normalItems = items.Where(x => !rpcItems.Contains(x));