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

本文关键字:动态 列表 求和 ExpandoObject | 更新日期: 2023-09-27 18:29:52

我有一个以ExpandoObject为项目的动态列表:

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

如何在动态列表中使用.Sum()?我知道这些房产的名字但Sum()不将字符串作为参数。

感谢

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

假设您有这样的列表:

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"]);

您可以使用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();

在我看来,你可以试试这个:

 var listSum = list.Sum(item => item.GetType().GetProperty("propertyName").GetValue());

我调用了list,即您要调用Sum方法的列表。

如果结果是你想要的,请告诉我。