gpt4 book ai didi

c# - 在泛型集合中使用 LINQ

转载 作者:太空狗 更新时间:2023-10-30 01:11:21 28 4
gpt4 key购买 nike

请考虑解释器模式实现中的以下片段:

public override object Execute(Interpreter interpreter, object ctx) {
var list = ctx as IEnumerable<string>;
return (list != null) ? list.FirstOrDefault() : null;
}

如果我想对整数使用相同的函数怎么办?

public override object Execute(Interpreter interpreter, object ctx) {
var list = ctx as IEnumerable<string>;
if (list != null) return list.FirstOrDefault();

var list = ctx as IEnumerable<int>;
return (list != null) ? list.FirstOrDefault() : null;
}

我想要的是这样的:

public override object Execute(Interpreter interpreter, object ctx) {
var list = ctx as IEnumerable;
return (list != null) ? list.FirstOrDefault() : null;
}

但 Linq 不作用于 IEnumerables。相反,为了获得这个解决方案,我将被迫编写如下内容:

public override object Execute(Interpreter interpreter, object ctx) {
var list = ctx as IEnumerable;
if (list != null) foreach(var i in list) { yield return i; return; }
return null;
}

或者使用泛型方法:

public override T Execute<T>(Interpreter interpreter, object ctx) {
var list = ctx as IEnumerable<T>;
return (list != null) ? list.FirstOrDefault() : null;
}

这会破坏解释器模式(因为它已在此系统中实现)。协变也会失败(至少在 C#3 中是这样),尽管它会起作用,但它正是我想要的行为:

public override object Execute(Interpreter interpreter, object ctx) {
var list = ctx as IEnumerable<object>;
return (list != null) ? list.FirstOrDefault() : null;
}

那么,我的问题是:实现预期行为的最佳方式是什么?


附录: digEmAll 建议使用如下代码:

var list = ctx as IEnumerable;
return (list != null) ? list.Cast<object>().FirstOrDefault() : null;

对于像 FirstOrDefault() 这样的东西,这是一个很好的答案。问题来自 Reverse 之类的东西:

var list = ctx as IEnumerable;
return (list != null) ? list.Cast<object>().Reverse() : null;

我可以给这个方法一个 List<int>但我会找回 List<object> .我知道,没有办法绕过协方差。所以我想 digEmAll 代码是迄今为止最好的答案。


谢谢:-)

最佳答案

这样的东西,能满足您的需求吗?

public override object Execute(Interpreter interpreter, object ctx) {
var nonGenericlist = ctx as IEnumerable;
if (nonGenericlist == null)
return null;
var list = nonGenericlist.Cast<object>();
return (list != null) ? list.FirstOrDefault() : null;
}

关于c# - 在泛型集合中使用 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2803312/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com