linq заполнить пользовательскую коллекцию - PullRequest
0 голосов
/ 03 февраля 2010

У меня есть коллекция, определенная как:

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

Используя linq, я могу использовать метод Select для возврата IEnumerable, и я могу вызвать .ToList для этого, чтобы получить IList, но есть ли какой-нибудь способ вернуть тип MyCollection? Потому что я пытаюсь создать экземпляр класса, который имеет свойство типа MyCollection, и я хочу использовать инициализацию объекта.

Например:

public class MyClass
{
    MyCollection TestCollection {get;set}
    ...
}

MyClass test = new MyClass()
{
    ...
    TestCollection = SomeObject.Select(item => new MyItem()
    {
        ...
    }).ToList();
}

Я получаю ошибку компиляции, потому что ToList возвращает List, и он не может быть приведен к объекту MyCollection. Есть ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 03 февраля 2010

Вам нужно будет создать свой экземпляр MyCollection с IEnumerable<MyItem>. Добавить конструктор, например:

public MyCollection(IEnumerable<MyItem> items) : base(items) {}

Затем, когда вы собираетесь использовать это, вы можете сделать:

TestCollection = new MyCollection(SomeObject.Select(item => new MyItem());
1 голос
/ 03 февраля 2010

Вы можете создать свой собственный метод расширения, который создает вашу коллекцию из IEnumerable, например

public static class Extensions
{
    public static MyCollection ToMyCollection(this IEnumerable<MyItem> items)
    { 
        //build and return your collection
    }
}

или если MyItem является заполнителем для универсальных типов в вашем контексте:

public static class Extensions
{
    public static MyCollection ToMyCollection<T>(this IEnumerable<T> items)
    {
        //build and return your collection
    }
}
0 голосов
/ 03 февраля 2010

Просто имитируй ToList:

public static class MyCollectionExtensions {
  public static MyCollection ToMyCollection(this IEnumerable<MyItem> source) {
    if (source == null) throw new NullReferenceException();
    return new MyCollection(source);
  }
}

MyCollection нужен новый конструктор:

public class MyCollection : List<MyItem> {
  public MyCollection() : base() { }
  public MyCollection(IEnumerable<MyItem> source) : base(source) { }
  ...
} 

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

public class MyClass {
  public MyCollection TestCollection { get { ... } } // should return a read-only collection
  public void Add(MyItem item) {
    _testCollection.Add(item);
  }
  MyCollection _testCollection = ...;
  ...
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...