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
?
Ответы
Ответ 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();