【问题标题】:Sum on a dynamic list that has ExpandoObject as items在以 ExpandoObject 作为项目的动态列表上求和
【发布时间】:2016-01-12 09:11:52
【问题描述】:
我有一个以 ExpandoObject 作为项目的动态列表:
List<dynamic> list = new List<dynamic>();
foreach (...)
{
var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
...
list.Add(dynamicObject);
}
如何在动态列表中使用 .Sum() ?我知道物业的名称
该列表中,但Sum() 不将字符串作为参数。
谢谢
【问题讨论】:
标签:
c#
.net
visual-studio
visual-studio-2013
dynamic
【解决方案1】:
假设你有这样的列表:
var list = new List<dynamic>
{
new ExpandoObject(),
new ExpandoObject(),
new ExpandoObject(),
};
list[0].Foo = 1;
list[1].Foo = 2;
list[2].Foo = 3;
您可以将ExpandoObject 的属性用作常规属性,如果它们的名称在编译时已知:
var sum1 = list
.Sum(item => item.Foo);
如果属性名称仅在运行时已知,则使用字典语法:
var sum2 = list
.Sum(item => (int)((IDictionary<string, object>)item)["Foo"]);
【解决方案2】:
你可以使用Sum(Func<TSource, int> selector)
为你举例:
var values = new int[] {1, 2, 3, 4, 5};
List<dynamic> list = new List<dynamic>();
foreach (var value in values)
{
var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
dynamicObject[value.ToString()] = value;
list.Add(dynamicObject);
}
// Kind of ugly as cast but otherwise it has trouble to find the Count property
var result = list.Sum(x => (x as IDictionary<string, Object>).Count);
Console.WriteLine("Result: {0}", result);
Console.ReadLine();
【解决方案3】:
在我看来你可以试试这个:
var listSum = list.Sum(item => item.GetType().GetProperty("propertyName").GetValue());
我调用了 list 你想调用 Sum 方法的列表。
如果结果是你想要的,请告诉我。