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

kiayqfof  于 2022-12-25  发布在  其他
关注(0)|答案(5)|浏览(198)

我有一个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所做的事情是否有任何好处/性能增益?

ztigrdn8

ztigrdn81#

您可以使用:

var mySKUs = myLines.Select(l => l.Sku).ToList();

在本例中,Select方法执行从IEnumerable<Line>IEnumerable<string>(SKU)的Map,然后ToList()将其转换为List<string>
请注意,这要求using System.Linq;位于. cs文件的顶部。

e5nqia27

e5nqia272#

这在LinQ中非常简单...您可以使用select语句来获取对象的属性的Enumerable。

var mySkus = myLines.Select(x => x.Sku);

或者如果你想把它作为一个数组...

var mySkus = myLines.Select(x => x.Sku).ToArray();
nwwlzxa7

nwwlzxa73#

我想你是在寻找

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
0md85ypi

0md85ypi4#

您可以选择myLines列表的所有Sku元素,然后将结果转换为数组。

string[] mySKUsArray = myLines.Select(x=>x.Sku).ToArray();
xfyts7mz

xfyts7mz5#

如果您对极其微小的、几乎不可估量的性能提升感兴趣,请向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; }
}

然后使用一个新方法Add创建一个基于List<Line>的专用集合类:

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

相关问题