我有两个事件类,叫他们StatusChanged和ValueChanged.我想知道将这些'流'暴露为IObservable.正在实施IObservable<Status>并IObservable<Value>在同一个班级'坏'?是否可能导致我(或我班级的用户)悲伤?
我有一个暴露IObservable状态的API .但是这种状态取决于必须通过初始化的潜在可观察源Init.
我想做的是保护用户不必按正确的顺序执行操作:就像目前的情况一样,如果他们Status在执行之前尝试订阅,则会Init因为源未初始化而获得异常.
所以我有一个天才的想法,用一个Subject来解耦这两个:订阅我的外部用户Status只是订阅主题,然后当他们调用时Init,我使用我的主题订阅底层服务.
private ISubject<bool> _StatusSubject = new Subject<bool>();
public IObservable<bool> Status { get { return _StatusSubject; } }
public void Init()
{
_Connection = new Connection();
Underlying.GetDeferredObservable(_Connection).Subscribe(_StatusSubject);
}
Run Code Online (Sandbox Code Playgroud)
但是,通过对虚拟项目的测试,问题是初始化通过订阅主题来"唤醒"我的基础Observable,即使没有人订阅该主题.如果可能的话,这是我想避免的,但我不确定如何......
(我也注意到所接受的智慧,"一般规则是,如果你正在使用一个主题,那么你做错了什么")
我想做什么的声明如下:
// Checks input source for timeouts, based on the number of elements received
// from clock since the last one received from source.
// The two selectors are used to generate output elements.
public static IObservable<R> TimeoutDetector<T1,T2,R>(
this IObservable<T1> source,
IObservable<T2> clock,
int countForTimeout,
Func<R> timedOutSelector,
Func<T1, R> okSelector)
Run Code Online (Sandbox Code Playgroud)
ascii中的大理石图很难,但是这里有:
source --o---o--o-o----o-------------------o---
clock ----x---x---x---x---x---x---x---x---x---
output --^---^--^-^----^-----------!-------^---
Run Code Online (Sandbox Code Playgroud)
我已经尝试寻找Observable可以组合source并clock以我可以使用的方式的现有函数,但是大多数组合函数依赖于接收"每个"中的一个(And,Zip),或者它们重新返回"之前"的值. "丢失"一个(CombineLatest),或他们是从我需要什么(只是太远Amb,GroupJoin,Join,Merge,SelectMany …
我通过IObservable属性暴露了一个温和的"昂贵"计算.
如果有多个订阅者,我想保护它不被多次运行,所以我在它后面放了一个Publish().RefCount(),但是当我坚持使用断点时,我仍然看到它被调用了两次.
public IObservable<int> Property
{
get { return _Source.Select(Expensive).Publish().RefCount(); }
}
Run Code Online (Sandbox Code Playgroud) 在我有一个带有此签名的方法的情况下找到自己
void DoSomething(IEnumerable<T> before, IEnumerable<T> after)
Run Code Online (Sandbox Code Playgroud)
当我只有一个元素而不是IEnumerable时,我发现自己经常不得不调用它.
我想添加三个重载,但是当其中一个参数为null时,这没有用.
所以我想我可以把我的单个元素'封装'在IEnumerable中并发送它,但是我在Enumerable上找不到任何看起来像我想要的东西(也许我看起来不够努力).
所以我正在看这样的事情
public static IEnumerable<T> EnumerableUnit<T>(T item)
{
if(item != null) yield return item;
}
Run Code Online (Sandbox Code Playgroud)
这是一个好主意吗?或者我应该做些什么?
我刚刚遇到了一个看似奇怪的设计选择:
System.IO.Path.GetDirectoryName(@"C:\folder\file.ext")
Run Code Online (Sandbox Code Playgroud)
返回"C:\ folder"
但
System.IO.Path.GetDirectoryName(@"C:\")
Run Code Online (Sandbox Code Playgroud)
返回null.
如果第一个示例返回"文件夹",我可以更好地理解它.
任何想法为什么会这样?当你想获得文件夹路径时,你会怎么做?
您如何决定选择哪种设计模式?
我对开发项目的态度始终如一.
我不确定设计模式在哪里有用.
需要一点帮助,我有两个信息源,该信息通过不同的程序导出到两个不同的CSV文件中。它们应该包含相同的信息,但这是需要检查的信息。
因此,我想做的如下:
文件为200,000奇数行,因此需要尽可能有效。
但是,尝试使用Excel进行此操作太复杂了,我真的很难找到一种以编程方式找到方法。
我有一个邮件功能,它工作正常,我收到邮件.但问题是我也得到了HTML标签.我的代码如下:
$from=$_REQUEST['id'];
$to = 'xyz@abc.com';
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers = "From: $from \r\n" .
"Reply-To: $from \r\n" .
"X-Mailer: PHP/" . phpversion();
$subject="Contact Mail has received";
$message=" SOME HTML TAGS ";
Run Code Online (Sandbox Code Playgroud)
邮件正文里面,我有HTML标签,如table,tr,td等等.但是当我收到邮件,我没有得到的表.我得到的所有的HTML标记为table,tr,td.在标题中,我甚至指定了内容类型text/html,但我仍然遇到同样的问题.
我怎么能避免这个?
如果Bind是monad的基础,为什么我们不在Linq中使用更多的SelectMany?
(抱歉,无法想到添加到问题中的任何有用的东西)
c# ×7
.net ×1
architecture ×1
csv ×1
html ×1
ienumerable ×1
linq ×1
monads ×1
php ×1
subject ×1