【问题标题】:Linq Select specific properties from list to 2d arrayLinq 从列表中选择特定属性到二维数组
【发布时间】:2017-01-20 20:40:23
【问题描述】:

我有想要导出到 excel 的对象列表:

//My export to excel function:
public static void ExportToExcel(string[,] data, string excelFilePath = null)
{
  // .....
}

我的列表包含很多列,所以我想选择特定的列并将它们添加到二维数组中,同时在顶部添加标题

公开课学生

{
    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. 地址.邮编

我可以使用 for 循环执行此操作,但是我对 linq 感兴趣,我也想听听您关于性能的建议,因为列表有 + 200k 条记录

编辑 样本

列 => ID 名称 邮政编码

行 => 值

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

【问题讨论】:

  • 为什么要使用二维数组而不是一些 DTO?您从哪里获得这些数据?
  • students.Select(i =&gt; new { i.Id, i.Name, i.Address.Zipcode }).ToArray() 之类的东西并将其保存到您想要的任何数组中。其实我不确定你为什么需要一个二维数组而不是一维数组?
  • 你的数组的二维是多少?你能展示你期望的数组的示例声明吗?
  • 如果您关心性能,那么ExportToExcel() 应该期待IEnumerable&lt;T&gt; 而不是string[,]。这样,您可以逐项逐行导出,而无需同时将所有 +200k 记录保存在内存中。
  • 帖子中添加的示例

标签: c# linq


【解决方案1】:

你可以创建另一个只包含你想要的列的类,比如 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();

编辑:如果要转换为二维字符串数组,请按照 Hari Prasad 的回答。

至于性能,你可能想看看this answer,也许可以使用多线程以某种方式加速处理大数据。

如果不限于Linq,我们可以将列表分成更小的列表,并创建多个线程并行分配数据,每个线程处理列表的一部分。

【讨论】:

    【解决方案2】:

    你可以处理 Jagged Arrays 并做这样的事情,没有直接的方法是在 Linq 中创建 multi dimensional 数组(至少我知道),所以尝试使用Array of Arrays

    var result = students.Select(x=> new string[] 
                                     {
                                          x.Id.ToString(), 
                                          x.Name, 
                                          x.Address.ZipCode
                                     })
                         .ToArray();
    

    仍然热衷于更改函数定义而不感兴趣?好吧,你可以使用这个logic 将结果转换为多维数组。

    【讨论】:

      【解决方案3】:

      我想我明白你为什么需要二维数组。我在使用 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

      【讨论】:

        【解决方案4】:

        你可以这样做

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

        【讨论】:

          猜你喜欢
          • 2015-11-05
          • 1970-01-01
          • 2011-11-07
          • 2016-06-15
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 2021-05-01
          • 2016-07-26
          相关资源
          最近更新 更多