我有一个动态列表,其中包含ExpandoObject作为项目:
List<dynamic> list = new List<dynamic>();
foreach (...)
{
var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
...
list.Add(dynamicObject);
}
如何在动态列表中使用.Sum()?我知道属性的名称
该列表,但Sum()
不接受字符串作为参数。
由于
答案 0 :(得分:2)
假设您有这样的列表:
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"]);
答案 1 :(得分:0)
在我看来你可以试试这个:
var listSum = list.Sum(item => item.GetType().GetProperty("propertyName").GetValue());
我在列表中调用了你想要调用Sum方法的列表。
如果结果符合您的要求,请告诉我。
答案 2 :(得分:0)
您可以使用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();