C# 通过迭代将一个类数据映射到另一个类
我有一个C#项目,正在寻找将一个类对象数据映射到另一个类对象列表的简单解决方案 这是我的输入类C# 通过迭代将一个类数据映射到另一个类,c#,iteration,C#,Iteration,我有一个C#项目,正在寻找将一个类对象数据映射到另一个类对象列表的简单解决方案 这是我的输入类 public class RatesInput { public string Type1 { get; set; } public string Break1 { get; set; } public string Basic1 { get; set; } public string Rate1 { get; set; }
public class RatesInput
{
public string Type1 { get; set; }
public string Break1 { get; set; }
public string Basic1 { get; set; }
public string Rate1 { get; set; }
public string Type2 { get; set; }
public string Break2 { get; set; }
public string Basic2 { get; set; }
public string Rate2 { get; set; }
public string Type3 { get; set; }
public string Break3 { get; set; }
public string Basic3 { get; set; }
public string Rate3 { get; set; }
}
这是我的另一个班级结构
public class RateDetail
{
public string RateType { get; set; }
public decimal Break { get; set; }
public decimal Basic { get; set; }
public decimal Rate { get; set; }
}
它有一个如下所示的对象。(为了便于理解,我使用硬编码值和从csv文件中实际分配的值)
然后我需要给“RateDetail”列表对象赋值,如下所示
List<RateDetail> lstDetails = new List<RateDetail>();
//START Looping using foreach or any looping mechanism
RateDetail obj = new RateDetail();
obj.RateType = //first iteration this should be assigned objInput.Type1, 2nd iteration objInput.Type2 etc....
obj.Break = //first iteration this should be assigned objInput.Break1 , 2nd iteration objInput.Break2 etc....
obj.Basic = //first iteration this should be assigned objInput.Basic1 , 2nd iteration objInput.Basic2 etc....
obj.Rate = //first iteration this should be assigned objInput.Rate1, 2nd iteration objInput.Rate2 etc....
lstDetails.Add(obj); //Add obj to the list
//END looping
List lstDetails=新列表();
//使用foreach或任何循环机制开始循环
RateDetail obj=新的RateDetail();
obj.RateType=//第一次迭代应将其分配给objInput.Type1,第二次迭代应分配给objInput.Type2等。。。。
obj.Break=//第一次迭代应将其分配给objInput.Break1、第二次迭代objInput.Break2等。。。。
obj.Basic=//第一次迭代应该分配给objInput.Basic1,第二次迭代应该分配给objInput.Basic2等等。。。。
obj.Rate=//第一次迭代应分配objInput.Rate1、第二次迭代objInput.Rate2等。。。。
详细信息。添加(obj)//将obj添加到列表中
//端环
是否有任何方法可以将“RatesInput”类数据转换为“RateDetail”类,如C#中的上述方法?如果是,如何迭代数据集?尝试以下操作:
public class RatesList : IEnumerable<RateDetail>
{
public RatesList(IEnumerable<RatesInput> ratesInputList)
{
RatesInputList = ratesInputList;
}
private readonly IEnumerable<RatesInput> RatesInputList;
public IEnumerator<RateDetail> GetEnumerator()
{
foreach (var ratesInput in RatesInputList)
{
yield return new RateDetail
{
RateType = ratesInput.Type1,
Break = Convert.ToDecimal(ratesInput.Break1, new CultureInfo("en-US")),
Basic = Convert.ToDecimal(ratesInput.Basic1, new CultureInfo("en-US")),
Rate = Convert.ToDecimal(ratesInput.Rate1, new CultureInfo("en-US"))
};
yield return new RateDetail
{
RateType = ratesInput.Type2,
Break = Convert.ToDecimal(ratesInput.Break2),
Basic = Convert.ToDecimal(ratesInput.Basic2),
Rate = Convert.ToDecimal(ratesInput.Rate2, new CultureInfo("en-US"))
};
yield return new RateDetail
{
RateType = ratesInput.Type3,
Break = Convert.ToDecimal(ratesInput.Break3),
Basic = Convert.ToDecimal(ratesInput.Basic3),
Rate = Convert.ToDecimal(ratesInput.Rate3, new CultureInfo("en-US"))
};
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
公共类费率列表:IEnumerable
{
公共费率列表(IEnumerable rates输入列表)
{
RatesInputList=RatesInputList;
}
私有只读IEnumerable Rates输入列表;
公共IEnumerator GetEnumerator()
{
foreach(var费率输入费率输入列表)
{
收益率-收益率-新费率明细
{
RateType=ratesInput.Type1,
Break=Convert.ToDecimal(ratesInput.Break1,新文化信息(“en-US”),
Basic=转换为DECIMAL(ratesInput.Basic1,新文化信息(“美国”),
Rate=Convert.ToDecimal(ratesInput.Rate1,新文化信息(“en-US”))
};
收益率-收益率-新费率明细
{
RateType=ratesInput.Type2,
中断=转换为特定值(速率输入中断2),
基本=转换为具体值(比率输入基本值2),
Rate=Convert.ToDecimal(ratesInput.Rate2,新文化信息(“en-US”))
};
收益率-收益率-新费率明细
{
RateType=ratesInput.Type3,
中断=转换为特定值(速率输入中断3),
Basic=转换为DECIMAL(速率输入Basic3),
Rate=Convert.ToDecimal(ratesInput.Rate3,新文化信息(“en-US”))
};
}
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
}
和使用:
var list = new RatesList(new List<RatesInput>() { objInput });
foreach (var item in list)
{
Console.WriteLine(item.Basic);
}
var list=new RatesList(new list(){objInput});
foreach(列表中的变量项)
{
控制台写入线(基本项);
}
您可以使用反射
获取如下属性信息:
var props = objInput.GetType().GetProperties();
var types = props.Where(x => x.Name.StartsWith("Type"))
.Select(x => x.GetValue(objInput)).ToList();
var breaks = props.Where(x => x.Name.StartsWith("Break"))
.Select(x => x.GetValue(objInput)).ToList();
var basics = props.Where(x => x.Name.StartsWith("Basic"))
.Select(x => x.GetValue(objInput)).ToList();
var rates = props.Where(x => x.Name.StartsWith("Rate"))
.Select(x => x.GetValue(objInput)).ToList();
List<RateDetail> lstDetails = new List<RateDetail>();
for (int i = 0; i < types.Count; i++)
{
lstDetails.Add(new RateDetail
{
RateType = types[i].ToString(),
Break = Convert.ToDecimal(breaks[i]),
Basic = Convert.ToDecimal(basics[i]),
Rate = Convert.ToDecimal(rates[i])
});
}
var props=objInput.GetType().GetProperties();
var types=props.Where(x=>x.Name.StartsWith(“Type”))
.Select(x=>x.GetValue(objInput)).ToList();
var breaks=props.Where(x=>x.Name.StartsWith(“Break”))
.Select(x=>x.GetValue(objInput)).ToList();
var basics=props.Where(x=>x.Name.StartsWith(“Basic”))
.Select(x=>x.GetValue(objInput)).ToList();
var rates=props.Where(x=>x.Name.StartsWith(“Rate”))
.Select(x=>x.GetValue(objInput)).ToList();
List lstDetails=新列表();
for(int i=0;i
如果顺序很重要,在同一for循环中,使用3个列表存储具有“1”值、“2”值和“3”值的对象。在for循环之后,对所有3个listshank进行联合,以获得回复@Matt.G。你有什么线索可以在RatesInput类中循环使用吗?老实说,我不知道该怎么做。是否可以删除代码示例?您应该使用
var props = objInput.GetType().GetProperties();
var types = props.Where(x => x.Name.StartsWith("Type"))
.Select(x => x.GetValue(objInput)).ToList();
var breaks = props.Where(x => x.Name.StartsWith("Break"))
.Select(x => x.GetValue(objInput)).ToList();
var basics = props.Where(x => x.Name.StartsWith("Basic"))
.Select(x => x.GetValue(objInput)).ToList();
var rates = props.Where(x => x.Name.StartsWith("Rate"))
.Select(x => x.GetValue(objInput)).ToList();
List<RateDetail> lstDetails = new List<RateDetail>();
for (int i = 0; i < types.Count; i++)
{
lstDetails.Add(new RateDetail
{
RateType = types[i].ToString(),
Break = Convert.ToDecimal(breaks[i]),
Basic = Convert.ToDecimal(basics[i]),
Rate = Convert.ToDecimal(rates[i])
});
}