从列表中选择特定属性到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
可选字段:
- Id <
- 名称/gh>
- 地址。Zipcode
我可以用for循环执行此操作,但我对linq感兴趣,我也想听听你关于性能的建议,因为列表有+ 200k记录
编辑示例
Columns => ID Name Zipcode
values
ID Name Zip
1 Mike 1101
2 Jan 2250
3 Peter 4456
我想我明白为什么你需要二维数组。在使用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,我们可以将列表分成更小的列表,并创建多个线程并行分配数据,每个线程处理列表的一部分