从列表中选择特定属性到2d数组

本文关键字:属性 2d 数组 列表 选择 | 更新日期: 2023-09-27 18:06:50

我有一个对象列表,我想导出到excel:

//My export to excel function:
public static void ExportToExcel(string[,] data, string excelFilePath = null)
{
  // .....
}

我的列表包含许多列,所以我想选择特定的列并将它们添加到2d数组中,还添加顶部的标题

public class Student

{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public Address Adress { get; set; }
    public Evaluation Evaluation { get; set; }
    // ... many more
}

列表:

>   IEnumerable<Student> students

可选字段:

  1. Id
  2. <
  3. 名称/gh>
  4. 地址。Zipcode

我可以用for循环执行此操作,但我对linq感兴趣,我也想听听你关于性能的建议,因为列表有+ 200k记录

编辑示例

Columns => ID Name Zipcode

values

ID Name Zip
1  Mike 1101 
2  Jan  2250
3  Peter 4456

从列表中选择特定属性到2d数组

我想我明白为什么你需要二维数组。在使用linq和interop导出数百条记录时,我遇到了同样的问题。Excel

下面是我所做的一个简要概述:

var list = students.Select(i => new { i.Id, i.Name, i.Address.Zipcode }).ToList();
int i=0;
foreach (var stud in list)
{
    data[i, 0] = stud.Id;
    data[i, 1] = stud.Name;
    data[i, 2] = stud.Address.Zipcode;
    i++;
}

然后使用data数组通过Excel.Range.set_Value转换为excel区域。在我的代码中,我使用了2d对象数组而不是字符串,因为set_Value只接受对象数组。

testRng.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, data);

,其中teststring为Excel。范围

您可以处理Jagged Arrays并做这样的事情,在Linq中有没有直接创建multi dimensional数组的方法(至少我知道),所以尝试使用Array of Arrays

var result = students.Select(x=> new string[] 
                                 {
                                      x.Id.ToString(), 
                                      x.Name, 
                                      x.Address.ZipCode
                                 })
                     .ToArray();

仍然热衷于和不感兴趣的改变函数定义?那么,您可以使用此逻辑将结果转换为多维数组。

你可以这样做

class YourNewStuff
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Zip { get; set; }
}
var newstuff2 = new List<YourNewStuff>();
students.Select(x => newstuff2.Add(new YourNewStuff()
{
    Id = x.Id,
    Name = x.Name,
    Zip = x.Adress.Zip
});

你可以用你想要的列创建另一个类,比如LiteStudent

那就这样写。

students.select(x => new LiteStudent{
 Id = x.Id,
 Name = x.Name,
 ZipCode = x.Address.ZipCode
}).ToArray();

或者根本不创建新类

students.select(x => new {
 Id = x.Id,
 Name = x.Name,
 ZipCode = x.Address.ZipCode
}).ToArray();

编辑:如果您想转换为2D字符串数组,请遵循Hari Prasad的答案。

至于性能,你可能想看看这个答案,也许可以使用多线程来加速大数据的处理。

如果不限于Linq,我们可以将列表分成更小的列表,并创建多个线程并行分配数据,每个线程处理列表的一部分