繁体   English   中英

将C#列表中的数据从一种类型转换为另一种类型。

[英]Converting Data in a C# List from one type to another.

我想更好地学习Linq,所以如果这是一个愚蠢的问题,我会提前道歉。

给定以下类别:

class FormData 
{
   public string CustomerId {get; set;}
   public string FieldId {get; set;} 
   public string FieldValue {get; set;}
}

class CustomerDetails 
{
   public string CustomerId {get; set;}
   public FormField[] Fields {get; set;} 
}

class FormField
{
   public string FieldId {get; set;}
   public string FieldValue {get; set;} 
}

我正在尝试转换此数据

// example incoming data set 
List<FormData> formData = new List<FormData> {
   new FormData { CustomerId = 1, FieldId = "FirstName", FieldValue = "Peter" },   
   new FormData { CustomerId = 1, FieldId = "LastName", FieldValue = "Smith" },   
   new FormData { CustomerId = 1, FieldId = "PetsName", FieldValue = "Spot" },  
   new FormData { CustomerId = 2, FieldId = "FirstName", FieldValue = "Dougie" },   
   new FormData { CustomerId = 2, FieldId = "LastName", FieldValue = "Fresh" },   
   new FormData { CustomerId = 2, FieldId = "PetsName", FieldValue = "Skittles" }, 
   new FormData { CustomerId = 3, FieldId = "FirstName", FieldValue = "Sam" },   
   new FormData { CustomerId = 3, FieldId = "LastName", FieldValue = "Reynolds" },   
   new FormData { CustomerId = 3, FieldId = "PetsName", FieldValue = "Taco" }              
};

对此

// desired out going data set 
List<CustomerDetails> customerDetails = new List<CustomerDetails> {
   new CustomerDetails {
    CustomerId : 1, 
    Fields : [
           new FormField {FieldId = "FirstName", FieldValue = "Peter"}, 
           new FormField {FieldId = "LastName", FieldValue = "Smith"},
           new FormField {FieldId = "PetsName", FieldValue = "Spot"}
        ]
    },
   new CustomerDetails {
    CustomerId : 2, 
    Fields : [
           new FormField {FieldId = "FirstName", FieldValue = "Dougie"}, 
           new FormField {FieldId = "LastName", FieldValue = "Fresh"},
           new FormField {FieldId = "PetsName", FieldValue = "Skittles"}
        ]
    },
   new CustomerDetails {
    CustomerId : 3, 
    Fields : [
           new FormField {FieldId = "FirstName", FieldValue = "Sam"}, 
           new FormField {FieldId = "LastName", FieldValue = "Reynolds"},
           new FormField {FieldId = "PetsName", FieldValue = "Taco"}
        ]
    }
}; 

这是我目前的操作方式...有更好的方法吧?

var customerIds = formData.Distinct().Select(x => x.CustomerId).ToList();

var results = new List<CustomerDetails>(); 

foreach (var id in customerIds)
{
    var customerDetails = new CustomerDetails();
    customerDetails.CustomerId = id;

    var fields = new List<GuestItemDataFieldResult>(); 

    foreach (var f in formData.Where(x => x.CustomerId == id))
    {
    var field = new FormField();
        field.FirstName = f.FirstName; 
        field.LastName = f.LastName; 
        field.PetsName = f.PetsName;

        fields.Add(field); 
    }

    customerDetails.Fields = fields.ToArray(); 

    results.Add(customerDetails); 
}

干得好:

var newData =
    formData.GroupBy(g1 => g1.CustomerId)
        .Select(
            s1 =>
                new CustomerDetails
                {
                    CustomerId = s1.Key.ToString(),
                    Fields =
                        s1.Select(s2 => new FormField {
                                FieldId = s2.FieldId, 
                                FieldValue = s2.FieldValue})
                            .ToArray()
                });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM