C# 对同构列表求和
我正在开发一个C应用程序。我有多个对象列表,即每个列表包含不同类型的值,如double、int等,以列表中对象的形式存储。每个列表都包含相同类型的对象C# 对同构列表求和,c#,list,sum,type-conversion,numbers,C#,List,Sum,Type Conversion,Numbers,我正在开发一个C应用程序。我有多个对象列表,即每个列表包含不同类型的值,如double、int等,以列表中对象的形式存储。每个列表都包含相同类型的对象 List<object> l1 = {1,2,3,4,5,6}; List<object> l2 = {1.1, 2.1, 3.2, 4.2, 5.6, 6.1, 7.5, 8.6, 9.2}; 这给了我对象的类型。现在我必须将列表中的所有值转换为这种类型。目前,我正在尝试: dynamic sum = null; T
List<object> l1 = {1,2,3,4,5,6};
List<object> l2 = {1.1, 2.1, 3.2, 4.2, 5.6, 6.1, 7.5, 8.6, 9.2};
这给了我对象的类型。现在我必须将列表中的所有值转换为这种类型。目前,我正在尝试:
dynamic sum = null;
Type typeOfCurrentField = null;
for(int i = 0; i < l1.Count; i++)
{
if (typeOfCurrentField == null)
{
typeOfCurrentField = l1[i].GetType();
sum = Convert.ChangeType(l1[i], typeOfCurrentField);
}
else
{
sum = sum + Convert.ChangeType(l1[i], typeOfCurrentField);;
}
}
如何克服这个问题?动态和=0;
l1.Cast中的foreach变量v
总和+=v;
动态和=0;
l1.Cast中的foreach变量v
总和+=v;
是否总是存储数值?列表中的所有项目都将具有相同的类型?是的,值将是数字,并且单个列表将具有相同类型@dbvega的所有值。在这种情况下,您不需要检查类型来计算总和。我会发布一个答案,看看。如果可以避免的话,请不要使用动态。您可以使用反射动态调用Enumerable.Cast,然后再调用Enumerable.Sum,但最终结果仍然是必须强制转换为某个静态类型的对象。或者看看Jon Skeets,但您仍然需要反射和MakeGenericMethodar始终存储数值?列表中的所有项目都将具有相同的类型?是的,值将是数字,并且单个列表将具有相同类型@dbvega的所有值。在这种情况下,您不需要检查类型来计算总和。我会发布一个答案,看看。如果可以避免的话,请不要使用动态。您可以使用反射动态调用Enumerable.Cast,然后再调用Enumerable.Sum,但最终结果仍然是必须强制转换为某个静态类型的对象。或者检查Jon Skeets,但仍然需要反射和MakeGenericMethod这会导致var list=new list{1,2.1f,3.2d,4.2m}出现异常@我问了奥利维耶罗吉尔,用户确认列表中的所有项目都是相同的类型。检查顶部的问题。变化不大:l1.Cast.ToList.ForEachv=>sum+=v@OlivierRogier我想把它写清楚。。这里是另一个l1.Cast.Aggregatea,b=>a+b@在本例中,Waleed Naveed动态告诉编译器变量的类型在运行时之前是未知的。这会导致var list=new list{1,2.1f,3.2d,4.2m};出现异常@我问了奥利维耶罗吉尔,用户确认列表中的所有项目都是相同的类型。检查顶部的问题。变化不大:l1.Cast.ToList.ForEachv=>sum+=v@OlivierRogier我想把它写清楚。。这里是另一个l1.Cast.Aggregatea,b=>a+b@在本例中,Waleed Naveed动态告诉编译器变量的类型在运行时之前是未知的。
dynamic sum = null;
Type typeOfCurrentField = null;
for(int i = 0; i < l1.Count; i++)
{
if (typeOfCurrentField == null)
{
typeOfCurrentField = l1[i].GetType();
sum = Convert.ChangeType(l1[i], typeOfCurrentField);
}
else
{
sum = sum + Convert.ChangeType(l1[i], typeOfCurrentField);;
}
}
Operator '+' cannot be applied to operands of type 'double' and 'object' Exception of type ==> Microsoft.CSharp.RuntimeBinder.RuntimeBinderException