【问题标题】:How to use a lambda expression on an ExpandoObject C# to find an array element value?如何在 ExpandoObject C# 上使用 lambda 表达式来查找数组元素值?
【发布时间】:2013-08-08 17:32:31
【问题描述】:

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

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

moduleData.gifts[34][0]=theValue

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

ExpandoObject.List<object>.List<object>

我尝试了以下 LINQ 表达式,但收到错误“无法使用 lambda 表达式作为动态分派操作的参数,而无需先将其转换为委托或表达式树类型”。

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

我尝试将“item”强制转换为 IEnumerable,但语法不正确。我将如何添加演员表或有更好的方法来实现这个目标?

【问题讨论】:

标签: c# .net linq


【解决方案1】:

尝试使用 TypeOf 扩展

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

【讨论】:

  • 你的意思是OfType,对吗?
【解决方案2】:

我假设礼物的类型是List&lt;Gift[]&gt;。然后你会这样做:

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

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

【讨论】:

  • .gifts 中的每一项都是一个数组,而不是一个 Gift 类的实例。
  • 编辑为列表
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多