Выбор нескольких свойств класса в одном запросе

#c# #linq

#c# #linq

Вопрос:

Следующий код берет коллекцию класса C и создает коллекцию, состоящую из значений двух свойств A и B. A и B помещаются в одну и ту же коллекцию:

 class A
{
    public int x { get; set; }
}
class B
{
    public int x { get; set; }
}
class C
{
    public A A { get; set; }
    public B B { get; set; }
}

..........

var items = new List<C>()
                {
                    new C()
                        {
                            A = new A() {x = 1},
                            B = new B() {x = 2}
                        },
                    new C()
                        {
                            A = new A() {x = 3},
                            B = new B() {x = 4}
                        },
                };

var qA = from item in items
         select (object)item.A;
var qB = from item in items
         select (object)item.B;
var qAll = qA.Concat(qB);
  

Возможно ли это сделать с помощью одного запроса?

Комментарии:

1. является items IList<C> ли ? почему вы приводите item.A и item.B к object ?

2. Yes. items — это IList<C> . Теперь я обновил код. Я добавляю A и B в object, поэтому я могу поместить их в одну коллекцию. Реальный код этого не делает, я использую интерфейс, от которого наследуют как A, так и B, но это не важно. Код в вопросе предназначен только для демонстрации идеи.

Ответ №1:

Если вы действительно хотите сгладить подобные свойства, вы можете передать массивы в SelectMany():

 var qAll = items.SelectMany(item => new object[] { item.A, item.B });
  

Ответ №2:

Вы могли бы использовать ForEach:

 var qAll = new List<object>();
items.ForEach(item => { qAll.Add(item.A); qAll.Add(item.B) });
  

Комментарии:

1. @Мистер Разочарование, я думаю. Извините за разочарование. Просто пытаюсь выполнить один запрос запроса.