Создать новый объект производного класса из List.FindAll - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть класс с именем Myitem и производный List класс MyItemCollection ...

public class MyItemCollection : List<MyItem> { ... }
public class MyItem { ... }

Я хотел бы использовать FindAll для возврата нового экземпляра MyItemCollection класс, содержащий подмножество MyItem значений ...

public MyItemCollection GetInUse()
{
  return this.FindAll(x => x.InUse);
}

Однако, так как FindAll возвращает List<MyItem>, а не MyItemCollection, вышеприведенный сбой.

Можно ли заставить .FindAll вернуть объект MyItemsCollection или инициировать объект MyItemsCollection, используя возврат из .FindAll?

Я мог бы сделать следующее , который работает, но я хотел бы знать, есть ли лучшее решение ...

public MyItemCollection GetInUse(bool inUse)
{
  var col = new MyItemsCollection();
  foreach (var item in this.FindAll(x => x.InUse))
    col.Add(item);
  return col;
}

1 Ответ

1 голос
/ 19 февраля 2020

List<T> имеет конструктор, который принимает аргумент IEnumerable<T>. Вы можете выставить похожий конструктор в своем классе, а затем сделать что-то вроде этого:

public MyItemCollection GetInUse() => new MyItemCollection(this.Where(i => i.InUse));

В качестве альтернативы, не используйте свою собственную коллекцию. Если вы просто хотите добавить вспомогательные методы в список, вы можете использовать методы расширения:

public static IEnumerable<MyItem> GetInUse(this IEnumerable<MyItem> e) 
  => e.Where(i => i.InUse);

Вы также можете спроектировать свои классы, чтобы иметь эти расширенные помощники через интерфейс. Это удобно, если у вас есть несколько несвязанных классов с похожей функциональностью. Методы расширения могут либо использовать интерфейс в качестве аргумента типа для IEnumerable, либо быть самими generi c с ограничениями типа c на тип.

...