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

时间:2016-09-13 09:37:54

标签: c# linq

我有要导出到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. 编号
  2. 名称
  3. Address.Zipcode
  4. 我可以用for循环执行此操作但是我对linq感兴趣,我也希望听到你对性能的建议,因为该列表有+ 200k记录

    修改 样品

      

    列=&gt; ID名称邮政编码

         

    行=&gt;值

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

4 个答案:

答案 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
});