LINQ从DTO对象列表中选择一个字段到数组
我有DTO类定义订单行,如下所示:
public class Line { public string Sku { get; set; } public int Qty { get; set; } }
类型为Line
的列表的填充方式如下:
List myLines = new List(); 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从myLines
列表中获取一系列SKU。 我怎么能这样做呢?
我目前正在手动这样做…
// Get SKU List List mySKUs = new List(); foreach (Line myLine in myLines) mySKUs.Add(myLine.Sku); string[] mySKUsArray = mySKUs.ToArray();
提前致谢。 我试图谷歌寻求解决方案,但我不知道如何说出问题……
PS使用LINQ
方法实现我目前使用foreach
做的事情有什么好处/性能提升?
您可以使用:
var mySKUs = myLines.Select(l => l.Sku).ToList();
在这种情况下, Select
方法执行从IEnumerable
到IEnumerable
(SKU)的映射,然后ToList()
将其转换为List
。
请注意,这需要using System.Linq;
位于.cs文件的顶部。
这在LinQ中非常简单…您可以使用select语句来获取对象的Enumerable属性。
var mySkus = myLines.Select(x => x.Sku);
或者,如果你想将它作为一个数组,那就……
var mySkus = myLines.Select(x => x.Sku).ToArray();
您可以选择myLines列表中的所有Sku元素,然后将结果转换为数组。
string[] mySKUsArray = myLines.Select(x=>x.Sku).ToArray();
我想你在找;
string[] skus = myLines.Select(x => x.Sku).ToArray();
但是,如果您要在后续代码中迭代sku,我建议不要使用ToArray()
位,因为它会过早地强制执行查询并使应用程序性能变差。 相反,你可以做;
var skus = myLines.Select(x => x.Sku); // produce IEnumerable foreach (string sku in skus) // forces execution of the query
如果您对非常小的,几乎无法估量的性能提升感兴趣,请在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
创建一个专门的集合类, Add
:
public class LineList : List { public void Add(string sku, int qty) { this.Add(new Line(sku, qty)); } }
然后,通过使用集合初始化程序,填充列表的代码变得更简洁:
LineList myLines = new LineList { { "ABCD1", 1 }, { "ABCD2", 1 }, { "ABCD3", 1 } };
当然,正如其他答案所述,使用LINQ将SKU提取到字符串数组中是微不足道的:
string[] mySKUsArray = myLines.Select(myLine => myLine.Sku).ToArray();