我有要导出到excel的对象列表:
//My export to excel function:
public static void ExportToExcel(string[,] data, string excelFilePath = null)
{
// .....
}
我的列表包含很多列,所以我想选择特定列并将它们添加到2d数组中,同时在顶部添加标题
公共班学生
{
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
要选择的字段:
我可以用for循环执行此操作但是我对linq感兴趣,我也希望听到你对性能的建议,因为该列表有+ 200k记录
修改 样品
列=&gt; ID名称邮政编码
行=&gt;值
ID Name Zip
1 Mike 1101
2 Jan 2250
3 Peter 4456
答案 0 :(得分:2)
你可以处理Jagged Arrays
并执行类似的操作,没有在multi dimensional
中创建Linq
数组的直接方法(至少我是& #39; m知道),所以尝试使用Array of Arrays
。
var result = students.Select(x=> new string[]
{
x.Id.ToString(),
x.Name,
x.Address.ZipCode
})
.ToArray();
对改变功能定义仍然敏感且不感兴趣?好吧,您可以使用此logic将结果转换为多维数组。
答案 1 :(得分:2)
我想我明白为什么你需要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);
其中testRng是Excel.Range
答案 2 :(得分:0)
你可以用你想要的列创建另一个类,比如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的回答。
至于性能,您可能需要查看this answer,可能会使用多线程以某种方式加速处理大数据。
如果不限于Linq,我们可以将列表分成较小的列表并创建多个线程来并行分配数据,每个线程处理列表的一部分。
答案 3 :(得分:0)
你可以做这样的事情
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
});