[英]Linq Select specific properties from list to 2d array
我有要導出到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感興趣,我也想聽聽您對性能的建議,因為該列表有+ 20萬條記錄
編輯樣本
列=> ID名稱郵政編碼
行=>值
ID Name Zip
1 Mike 1101
2 Jan 2250
3 Peter 4456
您可以處理Jagged Arrays
並執行類似的操作,在Linq
沒有直接創建multi dimensional
數組的方法(至少我知道),因此請嘗試使用Array of Arrays
。
var result = students.Select(x=> new string[]
{
x.Id.ToString(),
x.Name,
x.Address.ZipCode
})
.ToArray();
仍然熱衷並且對更改函數定義不感興趣? 好吧,您可以使用此邏輯將結果轉換為多維數組。
我想我理解您為什么需要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范圍。 在我的代碼中,我使用了二維對象數組而不是字符串,因為set_Value僅接受對象數組。
testRng.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, data);
其中testRng是Excel.Range
您可以只用所需的列創建另一個類,例如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,我們可以將列表分成較小的列表,並創建多個線程來並行分配數據,每個線程處理列表的一部分。
你可以做這樣的事情
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
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.