簡體   English   中英

Linq從列表到2D數組中選擇特定屬性

[英]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

要選擇的字段:

  1. ID
  2. 名稱
  3. Address.Zipcode

我可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM