对具有ExpandoObject作为项的动态列表求和

时间:2016-01-12 09:11:53

标签: c# .net visual-studio visual-studio-2013 dynamic

我有一个动态列表,其中包含ExpandoObject作为项目:

List<dynamic> list = new List<dynamic>();
foreach (...)
{
    var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;

    ...
    list.Add(dynamicObject);
}

如何在动态列表中使用.Sum()?我知道属性的名称 该列表,但Sum()不接受字符串作为参数。

由于

3 个答案:

答案 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();