Я ищу элегантное решение для следующей ситуации:
У меня есть класс, который содержит список вроде
class MyClass{
...
public List<SomeOtherClass> SomeOtherClassList {get; set;}
...
}
Третий класс, называемый Model
, содержит List<Myclass>
, с которым я работаю с extern.
Теперь я хотел бы расширить класс Model с помощью метода, который возвращает все уникальные экземпляры SomeOtherClass для всех экземпляров MyClass.
Я знаю, что есть метод Union()
, и с помощью цикла foreach я мог бы легко решить эту проблему, что я и сделал на самом деле. Однако, поскольку я новичок во всех возможностях C # 3 +, мне любопытно, как этого можно добиться более элегантно, с Linq или без него.
Я нашел подход, который мне кажется довольно неуклюжим, но он работает:
List<SomeOtherClass> ret = new List<SomeOtherClass>();
MyClassList.Select(b => b.SomeOtherClasses).ToList().ForEach(l => ret = ret.Union(l).ToList());
return ret;
Примечание: свойство b.SomeotherClasses
возвращает List<SomeOtherClasses>
.
Этот код далек от совершенства, и некоторые вопросы возникают из-за того, что мне нужно выяснить, что такое хороший стиль для работы с C # 3, а что нет. Итак, я составил небольшой список с мыслями об этом фрагменте, и я был бы рад получить несколько комментариев. Кроме того, я был бы рад услышать некоторые комментарии о том, как улучшить этот код.
- Временный список
ret
мог бы быть частью подхода в C # 2, может быть, но правильно ли, что я смогу уйти в отставку из этого списка, используя вместо этого цепочку методов? Или я упускаю суть?
- Действительно ли необходимо использовать промежуточный метод
ToList()
? Все, что я хочу, - это выполнить дальнейшие действия с каждым участником выбора.
- Какова стоимость этих операций ToList ()? Это хороший стиль? Необходимая?
Спасибо.