如何在ExpandoObject C#上使用lambda表达式来查找数组元素值

本文关键字:表达式 lambda 查找 数组元素 ExpandoObject | 更新日期: 2023-09-27 18:26:59

我有一个ExpandoObject(moduleData),其中"gifts"属性包含一个List,列表中的每个项都是一个数组[25,43],其中包含两个整数值。

我的目标是搜索List并找到第一个元素等于值的数组。例如:

moduleData.gifts[34][0]=价值

编辑:礼物中的每个项目都是一个列表,而不是"礼物"类的一个实例。结构如下:

ExpandoObject.List<object>.List<object>

我尝试过以下LINQ表达式,但收到错误"如果不先将lambda表达式强制转换为委托或表达式树类型,就无法将其用作动态调度操作的参数"。

var test = (List<object>)Model.moduleData.gifts.FirstOrDefault(item => item[index][0] = 99);

我尝试过将"item"强制转换为IEnumerable,但无法获得正确的语法。我该如何添加选角,或者有更好的方法来实现这个目标吗?

如何在ExpandoObject C#上使用lambda表达式来查找数组元素值

尝试使用TypeOf扩展

Model.moduleData.gifts.TypeOf<Gift>().FirstOrDefault(item => item[index][0] = 99);

我认为礼物属于List<Gift[]>类型。然后你会做:

var test = ((List<Gift[]>)Model.moduleData.gifts).FirstOrDefault(item => item[index][0] == 99);

原因是在编译时礼物的类型是未知的,所以C#编译器无法解析指定的lambda类型。

DavidN解决方案的一个替代方案是在Enumerable.FirstOrDefault上使用动态分辨率,并静态声明lambda:的类型

var test = Enumerable.FirstOrDefault(Model.moduleData.gifts,
                       (Func<List<Gift>, bool>)(item => item[0] = 99));