как собрать IEnumerable <IDisposable> - PullRequest
       10

как собрать IEnumerable <IDisposable>

0 голосов
/ 25 апреля 2009

У меня есть коллекция IEnumerable<IDisposable>, которую мне нужно удалить в данный момент. Проблема в том, что в некоторых случаях все объекты будут одного типа, и удаление объектов необходимо выполнить путем сбора некоторых данных из них и выполнения одного вызова RPC. В других случаях объекты будут другого типа, и мне просто нужно вызвать Dispose для каждого из них.

Я управляю кодом, делая это, но я бы не стал вдаваться в детали реализации.

Если мне нужно, я могу переключиться на что-то подобное, но это кажется не элегантным.

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

Редактировать: список (на данный момент) будет содержать только один тип или другой, но не оба одновременно. Но я бы предпочел, чтобы код Dispose вообще не знал о материалах RPC, e.i.:

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

Ответы [ 2 ]

3 голосов
/ 25 апреля 2009

Если это зависит от типа элемента, вы можете проверить, какой тип элемента вы получили, добавив в RPCDisposer только элементы этого конкретного типа.

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

Но еще лучше, если бы вы не смешивали эти объекты в одном и том же списке. Не могли бы вы провести рефакторинг своего кода, чтобы сохранить его в двух разных списках?

1 голос
/ 25 апреля 2009

Метод OfType может помочь вам разделить элементы на два списка ...

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