使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值
Posted
技术标签:
【中文标题】使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值【英文标题】:Get Child and Parent property values from class with nested arrays using LINQ 【发布时间】:2021-12-19 14:37:07 【问题描述】:所以又是一个 linq 问题。
有没有办法通过 linq 只知道嵌套最深的子属性的值来提取子属性值和父属性值?
要扩展我的问题,这就是我想要做的:
我有这个,但作为一个更大的版本。虽然基本的格式结构可以在这里理解。我将对象反序列化为 c# 类:
"id": "ProductCatalogId1",
"name": "Product Catalog 1",
"result":
"productFamily": [
"id": "FamilyId1",
"name": "Family 1",
"productCategory": [
"id": "CategoryId1",
"name": "Category 1",
"productConstruction": [
"id": "ConstructionId1",
"name": "Construction 1",
"productLine": [
"id": "LineId1",
"name": "Line 1",
"productModel": [
"id": "pModelId1",
"name": "pModel 1",
"customerModel": [
"id": "cModelId1",
"name": "cModel 1"
]
,
"id": "pModelId2",
"name": "pModel 2",
"customerModel": [
"id": "cModelId2",
"name": "cModel 2"
]
]
]
]
]
]
与上述结构相关的类:
public class Productcatalog
public string id get; set;
public string name get; set;
public StructureResult result get; set;
public class StructureResult
public Productfamily[] productFamily get; set;
public class Productfamily
public string id get; set;
public string name get; set;
public Productcategory[] productCategory get; set;
public FulfilsKeyTechnology[] FulfilsKeyTechnology get; set;
public class Productcategory
public string id get; set;
public string name get; set;
public Productconstruction[] productConstruction get; set;
public class Productconstruction
public string id get; set;
public string name get; set;
public Productline[] productLine get; set;
public class Productline
public string id get; set;
public string name get; set;
public Productmodel[] productModel get; set;
public class Productmodel
public string id get; set;
public string name get; set;
public Customermodel[] customerModel get; set;
public class Customermodel
public string id get; set;
public string name get; set;
我想要做的是在最后得到一个看起来像这样的列表,从具有相同属性的类序列化:
[
"productConstructionId":"ConstructionId1",
"productConstructionName":"Construction 1",
"productLineId":"LineId1",
"productLineName":"Line 1",
"customerModelId":"cModelId1",
"customerModelName":"cModel 1"
,
"productConstructionId":"ConstructionId1",
"productConstructionName":"Construction 1",
"productLineId":"LineId1",
"productLineName":"Line 1",
"customerModelId":"cModelId2",
"customerModelName":"cModel 2"
]
与上述结构相关的类:
public class ModelList
public string productConstructionId get; set;
public string productConstructionName get; set;
public string productLineId get; set;
public string productLineName get; set;
public string customerModelId get; set;
public string customerModelName get; set;
在这种情况下,也许 linq 甚至不是最佳实践?
【问题讨论】:
请您也发布您的两个课程吗? @Serge 好了。 【参考方案1】:试试这个
var jsonDeserialized = JsonConvert.DeserializeObject<Data>(json);
var list = new List<ModelList>();
foreach (var pf in jsonDeserialized.Result.ProductFamily)
foreach (var pct in pf.ProductCategory)
foreach (var pcn in pct.ProductConstruction)
foreach (var pl in pcn.ProductLine)
foreach (var pm in pl.ProductModel)
foreach (var cm in pm.CustomerModel)
var item = new ModelList
ProductFamilyId = pf.Id,
ProducFamilyName = pf.Name,
ProductCategoryId = pct.Id,
ProductCategoryName = pct.Name,
ProductConstructionId = pcn.Id,
ProductConstructionName = pcn.Name,
ProductLineId = pl.Id,
ProductLineName = pl.Name,
CustomerModelId = cm.Id,
CustomerModelName = cm.Name
;
list.Add(item);
输出
[
"ProductFamilyId": "FamilyId1",
"ProducFamilyName": "Family 1",
"ProductCategoryId": "CategoryId1",
"ProductCategoryName": "Category 1",
"ProductConstructionId": "ConstructionId1",
"ProductConstructionName": "Construction 1",
"ProductLineId": "LineId1",
"ProductLineName": "Line 1",
"CustomerModelId": "cModelId1",
"CustomerModelName": "cModel 1"
,
"ProductFamilyId": "FamilyId1",
"ProducFamilyName": "Family 1",
"ProductCategoryId": "CategoryId1",
"ProductCategoryName": "Category 1",
"ProductConstructionId": "ConstructionId1",
"ProductConstructionName": "Construction 1",
"ProductLineId": "LineId1",
"ProductLineName": "Line 1",
"CustomerModelId": "cModelId2",
"CustomerModelName": "cModel 2"
]
类
public class ModelList
public string ProductFamilyId get; set;
public string ProducFamilyName get; set;
public string ProductCategoryId get; set;
public string ProductCategoryName get; set;
public string ProductConstructionId get; set;
public string ProductConstructionName get; set;
public string ProductLineId get; set;
public string ProductLineName get; set;
public string CustomerModelId get; set;
public string CustomerModelName get; set;
public partial class Data
[JsonProperty("id")]
public string Id get; set;
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("result")]
public Result Result get; set;
public partial class Result
[JsonProperty("productFamily")]
public ProductFamily[] ProductFamily get; set;
public partial class ProductFamily
[JsonProperty("id")]
public string Id get; set;
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("productCategory")]
public ProductCategory[] ProductCategory get; set;
public partial class ProductCategory
[JsonProperty("id")]
public string Id get; set;
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("productConstruction")]
public ProductConstruction[] ProductConstruction get; set;
public partial class ProductConstruction
[JsonProperty("id")]
public string Id get; set;
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("productLine")]
public ProductLine[] ProductLine get; set;
public partial class ProductLine
[JsonProperty("id")]
public string Id get; set;
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("productModel")]
public ProductModel[] ProductModel get; set;
public partial class ProductModel
[JsonProperty("id")]
public string Id get; set;
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("customerModel")]
public CustomerModel[] CustomerModel get; set;
public partial class CustomerModel
[JsonProperty("id")]
public string Id get; set;
[JsonProperty("name")]
public string Name get; set;
【讨论】:
感谢您抽出宝贵时间并愿意帮助@Serge。看着你的例子,我注意到你错过了一个细节。抱歉不够清楚。 :) 你错过的细节是我已经知道最深层次的“customerModelId”。我只想要与该孩子的身份相关的信息和家长信息。我做了类似的事情,所以我知道可以以这种方式完成。 :) 我希望有更好的方法来使用 Linq 而不是一堆嵌套的 foreaches。 @John 感谢您的反馈。那你应该知道linq是把query转化为foreach循环,直接做会更高效。以上是关于使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值的主要内容,如果未能解决你的问题,请参考以下文章