如何使用C# LINQ将数据行拆分为两行并保留关联字段?
用LINQ实现数据集字段拆分需求
当然可以用LINQ轻松实现这个需求!而且完全能满足你“结果不嵌套”的要求,我给你详细说说怎么写:
首先,假设你的原数据是一个IEnumerable<OriginalItem>,先定义一下原数据的模型类(如果还没定义的话):
public class OriginalItem { public int ProductId { get; set; } public string Name { get; set; } public decimal Percent { get; set; } public int RowIndex { get; set; } }
然后定义转换后的结果模型类,用来存储拆分后的数据:
public class ResultItem { public int ProductId { get; set; } public string DataType { get; set; } public object Value { get; set; } // 兼容string和decimal两种类型,若需要统一类型可改为string并做转换 public int RowIndex { get; set; } }
接下来就是核心的LINQ转换代码,这里用到SelectMany方法——它的作用就是把每个原数据项映射成多个结果项,同时自动将所有结果平铺成一个无嵌套的IEnumerable<ResultItem>:
// 假设originalData是你的原数据集 IEnumerable<OriginalItem> originalData = GetYourOriginalData(); var splitResult = originalData.SelectMany(item => new[] { // 生成Name对应的行 new ResultItem { ProductId = item.ProductId, DataType = "Name", Value = item.Name, RowIndex = item.RowIndex }, // 生成Percent对应的行 new ResultItem { ProductId = item.ProductId, DataType = "Percent", Value = item.Percent, RowIndex = item.RowIndex } });
额外小技巧
如果你不想提前定义ResultItem类,也可以直接用匿名类型来简化代码,省去定义类的步骤:
var splitResult = originalData.SelectMany(item => new[] { new { item.ProductId, DataType = "Name", Value = item.Name, item.RowIndex }, new { item.ProductId, DataType = "Percent", Value = item.Percent, item.RowIndex } });
要是你需要把Value统一成字符串类型(比如后续处理更方便),只需要把Value的赋值改成:
- Name行:
Value = item.Name(本来就是字符串) - Percent行:
Value = item.Percent.ToString("F2")(保留两位小数,格式可按需调整)
这样处理后,你得到的就是完全平铺的结果集合,没有任何嵌套,完全符合你的要求哦!
内容的提问来源于stack exchange,提问作者impo
相关产品推荐
相关产品推荐

