3 回答
![?](http://img1.sycdn.imooc.com/54584f8f00019fc002200220-100-100.jpg)
TA贡献1906条经验 获得超3个赞
尝试这个:
var intList = new List<int>() { 1, 1, 2, 2, 3, 3, 4, 1, 1, 5, 6, 7, 1, 1 };
var intObsrvr = intList.ToObservable();
var query =
intObsrvr
.Scan(
new { skip = false, value = int.MinValue },
(a, x) => new { skip = (a.value == 1) && (x == 1) , value = x })
.Where(x => !x.skip)
.Select(x => x.value);
我觉得.Scan被严重低估了。
您还可以使用.Publish/ Zip/ SelectMany:
var query =
intObsrvr.Publish(
xs => xs
.StartWith(int.MinValue)
.Zip(xs, (z, x) => z == 1 & x == 1 ? new int[] { } : new [] { x })
.SelectMany(x => x));
随你挑。
var query =
intObsrvr.Publish(
xs => xs
.StartWith(int.MinValue)
.Zip(xs, (z, x) => z == 1 & x == 1
? Observable.Empty<int>()
: Observable.Return(x))
.SelectMany(x => x));
甚至更多的选择。
![?](http://img1.sycdn.imooc.com/545845e900013e3e02200220-100-100.jpg)
TA贡献1936条经验 获得超6个赞
另一个Zip没有的变体SelectMany:
var observable = new List<int> { 1, 1, 2, 2, 3, 3, 4, 1, 1, 5, 6, 7, 1, 1 }
.ToObservable();
observable.StartWith(int.MinValue).Zip(observable, (previous, current) => (previous, current))
.Where(t => t.current != 1 || t.current != t.previous)
.Select(t => t.current);
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
TA贡献1826条经验 获得超6个赞
如果内置方法不符合您的要求,您始终可以创建自己的方法。
DistinctUntilChanged满足您需求的A相当简单:
public static IEnumerable<T> DistinctUntilChanged<T>(
this IEnumerable<T> source)
{
using (var e = source.GetEnumerator())
{
if (!e.MoveNext())
yield break;
yield return e.Current;
var previous = e.Current;
while (e.MoveNext())
{
if (!e.Current.Equals(previous))
{
yield return e.Current;
previous = e.Current;
}
}
}
}
- 3 回答
- 0 关注
- 157 浏览
添加回答
举报