- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
注意:请适本地重新标记和/或重命名
我有课,FooEnumerator
,它包装了一个 Foo
并实现 IEnumerable<FooEnumerator>
. Foo
s 代表树状数据结构,FooEnumerator
枚举出来的s是当前节点的子节点。
Foo
是供应商提供的数据对象。 FooEnumerator
实现了一堆自定义过滤代码。
class FooEnumerator : IEnumerable<FooEnumerator>
{
public Foo WrappedNode { get; private set; }
public string Name { get { return WrappedNode.Name; } }
public int Id { get{ return WrappedNode.Id; } }
public DateTime Created { get{ return WrappedNode.Created; } }
public FooEnumerator(Foo wrappedNode)
{
WrappedNode = wrappedNode;
}
public IEnumerator<FooEnumerator> GetEnumerator()
{
foreach (Foo child in this.GetChildren())
if(FilteringLogicInHere(child))
yield return new FooEnumerator(child);
}
...
}
我希望能够使用给定的(任意)表达式对树的每个级别进行排序,该表达式在顶层 FooEnumerator
时定义。已创建,并将此表达式传递给每个新枚举的项目以供使用。
我想使用 lambda 定义排序表达式,就像使用 OrderBy 函数一样。事实上,我打算将 lambda 传递给 OrderBy
.
OrderBy 的签名是
OrderBy<TSource, TKey>(Func<TSource, TKey> keySelector)
哪里TKey
是给定 Func
的返回类型, 但它是方法签名中的类型参数,并在编译时计算出来。
示例用法
var x = GetStartingNode();
var sort = n => n.DateTime;
var enu = new FooEnumerator(x, sort);
var sort2 = n => n.Name;
var enu2 = new FooEnumerator(x, sort2);
然后排序表达式将存储在一个类变量中,并且 FooEnumerator
会像这样工作:
// pseudo-implementation
private Expression<Func<Foo, TKey>> _sortBy;
public FooEnumerator(Foo wrappedNode, Expression<Func<Foo, TKey>> sortBy)
{
WrappedNode = wrappedNode;
_sortBy = sortBy;
}
public IEnumerator<FooEnumerator> GetEnumerator()
{
foreach (Foo child in this.GetChildren().OrderBy(_sortBy))
if(FilteringLogicInHere(child))
yield return new FooEnumerator(child);
}
在此用例中如何指定 TKey 的类型(隐式或显式)?
我不想对其进行硬编码,因为我希望能够对底层 Foo
的所有属性进行排序.
最佳答案
嗯,你不能创建类型为 Expression<Func<Foo,TKey>>
的成员委托(delegate)变量自 TKey
从未指定。但是,您可以创建类型为 Expression<Func<Foo,IComparable>>
的成员这可能足以满足您的目的。您可能需要更改您的 FooEnumerator
当然,构造函数也接受这个签名。
编辑:其他人建议参数化您的 FooEnumerator
以便它接受 TKey
.你当然可以这样做,但你应该意识到出现的问题:
FooEnumerator<T>
的代码必须具有类型的先验知识 T
.但是,您可以实现非通用接口(interface) IFooEnumerator
来处理这个问题。FooEnumerator<T>
很尴尬, FooEnumerator<T1,T2>
, FooEnumerator<T1,T2,T3...>
, 等等。关于c# - 传递 TResult 未知的 Func<T, TResult>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189131/
我正在研究撤消-重做实现,我希望其堆栈上的撤消或重做项目包含对某个 Func 的引用。其中 TResult本身就是一个 Func .重点是当Func从撤消堆栈调用,然后将返回值存储在重做堆栈中(反之亦
Func<>在 .NET 中非常方便。有没有一种方法可以指定参数类型并将结果值设置为 void?我想通过 void Write(string)作为参数。 最佳答案 Action - “封装一个接受单个
注意:请适本地重新标记和/或重命名 我有课,FooEnumerator ,它包装了一个 Foo并实现 IEnumerable . Foo s 代表树状数据结构,FooEnumerator枚举出来的s是
如果我只能访问任务,如何使用反射或任何其他方式创建和返回延续任务? 我需要一种方法让继续中的异常返回到原始调用者。据我所知,这只能通过返回延续任务而不是原始任务来完成。问题在于我不知道任务的结果类型,
我在运行我的应用程序时遇到此错误(尽管我的应用程序运行正常): C:\Users\dassa\Downloads\flutter_windows_2.2.3-stable\flutter\.pub-c
我正在加载一个程序集并调用一个静态方法,该方法将使用 MethodInfo.Invoke() 通过反射创建一个类型为“MyClass1”(此类型在运行时指定)的新对象。当该方法是普通同步方法时,这很好
首先,我知道我可以只定义两个重载的辅助方法来完成我需要的事情(或者甚至只定义两个具有不同名称的 Func<>),但它们只被一个公共(public)方法使用,所以我'我正在探索定义两个本地 Func<>
正如标题所说,“如何将 TResult 转换为 object 或 List 到 Expression 中?” public Task ExplicitLoadAsync(T entity, E
首先,foo 是一个 Func 对象。有可能做类似的事情 Func bar = ConvertFunction(foo); 从而将 Func 转换为 Func。 最佳答案 是的,这是可能的: Func
我非常喜欢使用 C# 5.0 异步编程。然而,有几个地方更新旧代码以与 TAP 模型保持一致给我带来了问题。 这是其中之一 - 我不确定为什么 Task 在 TResult 中不是协变的,但在尝试更新
我正在使用 Entity Framework 、ASP.NET 和 C#3.5我借用了以下代码,使用 GridView 中的 sortExpression 而不是实体的属性来进行排序: pub
如何使用“async Task”从方法返回数据。我尝试按照以下链接使用, How to handle return values in async function谁能给个答案? 使用的方法, Pub
根据documentation ValueTask ... Provides a value type that wraps a Task and a TResult, only one of whi
我承认这个问题是主观的,但我对社区的观点很感兴趣。我有一个缓存类,它采用 Func 类型的缓存加载器函数。 ,它用于从数据库中检索值并将其存储在缓存中。 public static class Cac
我有这个简单的代码,可以异步启动方法。它使用TCS以便使用Task包装代码。 Task DoWork() { var source = new TaskCompletionSource ();
我有两个类(它们保存在 RavenDB 中): public class Game { public int Id { get; set; } public int HomeTeamI
我不能使用 ToList()扩展方法。我使用的代码是, return this.Semesters.ToList() 上面代码中的'Semesters'是一个EntityCollection。这些
我有一个扩展类扩展 Func其签名如下所示: public static ITryAndReturnValue Try(this Func func, T arg, int retries) 我可以通
这个问题在这里已经有了答案: Await on a completed task same as task.Result? (2 个答案) 关闭 6 年前。 我写了一个小例子来在方法 TestMet
我有一个条件对象,如果它的值不为空,我将在其中将每个属性转换为一个函数。 public class TestClassCriteria { public bool? ColumnA { get
我是一名优秀的程序员,十分优秀!