Подтвердить что ты не робот

LINQ выберите одно поле из списка объектов DTO в массив

У меня есть класс DTO, который определяет строку порядка следующим образом:

public class Line
{
    public string Sku { get; set; }
    public int Qty    { get; set; }
}

Список типов Line заполняется так:

List<Line> myLines = new List<Line>();
myLines.Add(new Line() { Sku = "ABCD1", Qty = 1 });
myLines.Add(new Line() { Sku = "ABCD2", Qty = 1 });
myLines.Add(new Line() { Sku = "ABCD3", Qty = 1 });

Я хочу использовать LINQ для получения массива SKU из списка myLines. Как я могу это сделать?

В настоящее время я делаю это вручную, как это...

// Get SKU List
List<string> mySKUs = new List<string>();
foreach (Line myLine in myLines)
    mySKUs.Add(myLine.Sku);
string[] mySKUsArray = mySKUs.ToArray();

Спасибо заранее. Я пытался Google для решения, но я не был уверен, как сформулировать вопрос...

P.S. есть ли какой-либо выигрыш/эффективность при использовании метода LINQ для достижения того, что я сейчас делаю с помощью foreach?

4b9b3361

Ответ 1

Вы можете использовать:

var mySKUs = myLines.Select(l => l.Sku).ToList();

В этом случае метод Select выполняет сопоставление от IEnumerable<Line> до IEnumerable<string> (SKU), затем ToList() преобразует его в List<string>.

Обратите внимание, что для этого требуется using System.Linq; находиться в верхней части вашего файла .cs.

Ответ 2

Это очень просто в LinQ... Вы можете использовать оператор select, чтобы получить Enumerable свойств объектов.

var mySkus = myLines.Select(x => x.Sku);

Или, если вы хотите, чтобы он как массив просто...

var mySkus = myLines.Select(x => x.Sku).ToArray();

Ответ 3

Вы можете выбрать все элементы Sku в списке myLines, а затем преобразовать результат в массив.

string[] mySKUsArray = myLines.Select(x=>x.Sku).ToArray();

Ответ 4

Я думаю, что вы ищете;

  string[] skus = myLines.Select(x => x.Sku).ToArray();

Однако, если вы собираетесь перебирать sku в следующем коде, я рекомендую не использовать бит ToArray(), поскольку он преждевременно заставляет выполнение запросов и ухудшает производительность приложений. Вместо этого вы можете просто сделать:

  var skus = myLines.Select(x => x.Sku); // produce IEnumerable<string>

  foreach (string sku in skus) // forces execution of the query

Ответ 5

В случае, когда вас интересует крайне незначительная, почти неизмеримая производительность, добавьте конструктор в класс Line, давая вам следующее:

public class Line
{
    public Line(string sku, int qty)
    {
        this.Sku = sku;
        this.Qty = qty;
    }

    public string Sku { get; set; }
    public int Qty    { get; set; }
}

Затем создайте специализированный класс коллекции на основе List<Line> с одним новым методом Add:

public class LineList : List<Line>
{
    public void Add(string sku, int qty)
    {
        this.Add(new Line(sku, qty));
    }
}

Затем код, который заполняет ваш список, становится немного менее подробным, используя инициализатор коллекции:

LineList myLines = new LineList
{
    { "ABCD1", 1 },
    { "ABCD2", 1 },
    { "ABCD3", 1 }
};

И, конечно, как утверждают другие ответы, тривиально извлекать SKU в строковый массив с LINQ:

string[] mySKUsArray = myLines.Select(myLine => myLine.Sku).ToArray();