LINQ从DTO对象列表中选择一个字段到数组

时间:2014-03-20 16:40:14

标签: c# linq

我有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所做的工作有什么好处/表现?

5 个答案:

答案 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();