我有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从myLines
列表中获取一系列SKU。我怎么能这样做?
我目前正在手动这样做......
// Get SKU List
List<string> mySKUs = new List<string>();
foreach (Line myLine in myLines)
mySKUs.Add(myLine.Sku);
string[] mySKUsArray = mySKUs.ToArray();
提前致谢。我试图谷歌寻求解决方案,但我不确定如何提出问题...
P.S。使用LINQ
方法实现我目前使用foreach
所做的工作有什么好处/表现?
答案 0 :(得分:58)
您可以使用:
var mySKUs = myLines.Select(l => l.Sku).ToList();
在这种情况下,Select
方法执行从IEnumerable<Line>
到IEnumerable<string>
(SKU)的映射,然后ToList()
将其转换为List<string>
请注意,这需要{。{1}}位于.cs文件的顶部。
答案 1 :(得分:3)
这在LinQ中非常简单...您可以使用select语句来获取对象的Enumerable属性。
var mySkus = myLines.Select(x => x.Sku);
或者如果你想把它作为一个数组就行......
var mySkus = myLines.Select(x => x.Sku).ToArray();
答案 2 :(得分:1)
您可以选择myLines列表中的所有Sku元素,然后将结果转换为数组。
string[] mySKUsArray = myLines.Select(x=>x.Sku).ToArray();
答案 3 :(得分:1)
我认为你正在寻找;
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
答案 4 :(得分:1)
如果您对非常小的,几乎无法估量的性能提升感兴趣,请在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 }
};
当然,正如其他答案所述,使用LINQ将SKU提取到字符串数组中是微不足道的:
string[] mySKUsArray = myLines.Select(myLine => myLine.Sku).ToArray();