gpt4 book ai didi

c# - 在 Rx 和 LINQ(或者一般来说,流和列表)之间共享查询

转载 作者:行者123 更新时间:2023-12-02 05:01:40 25 4
gpt4 key购买 nike

如何在 LINQ 和 Rx 之间共享查询逻辑?即,如果我有时需要查询 IObservable 流,有时需要查询 IEnumerable,但两者的逻辑完全相同,有没有办法共享该逻辑?

也许一个例子会有所帮助。在下面的 Queries 类中,我想结合人员和购买的序列来生成一个“通知”字符串。请注意,我必须复制完全相同的逻辑;唯一不同的是,一个是 IEnumerable,一个是 IObservable。有什么办法可以整合这两个功能?我尝试过使用 ToObservableToEnumerable 的各种组合,但我尝试过的所有操作似乎都挂起或没有结果。

(更高级的问题:创建高级类型的想法正是为了解决这个问题吗?也就是说,这在 Haskell 或 Scala 中甚至不是问题吗?)

static class Queries {
static IObservable<string> GetPurchaseNotices(IObservable<Person> people, IObservable<Purchase> purchases) {
return from person in people
from purchase in purchases
where person.Id == purchase.PurchaserId
select person.Name + " purchased a " + purchase.ItemName;
}

static IEnumerable<string> GetPurchaseNotices(IEnumerable<Person> people, IEnumerable<Purchase> purchases) {
return from person in people
from purchase in purchases
where person.Id == purchase.PurchaserId
select person.Name + " purchased a " + purchase.ItemName;
}
}

class Person {
public Person(int id, string name) {
Id = id;
Name = name;
}
public string Name;
public int Id;
}

class Purchase {
public Purchase(int purchaserId, string itemName) {
PurchaserId = purchaserId;
ItemName = itemName;
}
public int PurchaserId;
public string ItemName;
}

最佳答案

据我所知,这在 C#(或 F#)中是不可能的。问题是,虽然您可以抽象通用参数 TIEnumerable<T>IObservable<T> ,你不能对“种类”进行抽象IEnumerableIObservable .

对于更高级的类型,例如 Haskell 或 Scala 中的类型,您可以为 IEnumerble 提供合适的接口(interface)来表达它和 IObservable .在 Haskell 中,它看起来像这样:

getPurchases :: MonadPlus m => m Person -> m Purchaser -> m String
getPurchases people purchases = do
person <- people
purchase <- purchases
if (personId person) == (purchaserId purchase)
then return $ (name person) ++ "purchased a " ++ (itemName purchase)
else mzero

然后您可以将其用于 IEnumerableIObservable .

我不知道 IObservable 是否真的满足 MonadPlus 所需的法则然而,这只是一个例子。

关于c# - 在 Rx 和 LINQ(或者一般来说,流和列表)之间共享查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16979133/

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