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方法执行从IEnumerableIEnumerable (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();