Java Stream.iterate() generate() builder() C#怎么搞?

2020-07-04 21:12:37 +08:00
 lxilu
顺便,C# void List.Add() 怎么搞成链式调用?
若要自己写扩展方法有什么好的实践?
4432 次点击
所在节点    C#
5 条回复
AntiGameZ
2020-07-05 04:06:11 +08:00
关键词 LINQ 。

网上搜 “Java Stream 和 C# LINQ 比较” 应该也能给你很多资料。

void List.Add(),既然返回值是 void 了,没法链式调用呀。
lxilu
2020-07-05 10:51:31 +08:00
其它方法我都找到了对应,唯有这三个不知道。
我要问的就是返回 void 怎么搞成链式调用啊。
lxilu
2020-07-05 10:53:10 +08:00
AntiGameZ
2020-07-05 13:16:52 +08:00
Stream.iterate(), Stream.generate()
> Enumerable.Range(1, 100).Select(x => x * x);

如果你要无限流的话,可以自己写个。我不知道有没有新的语法糖可以开箱即用。
IEnumerable<T> InfiniteStream<T>()
{
while (true) { yield return default(T); }
}

Stream.builder() 的话,c# 直接支持集合类型的各种花式 initializer, .Select() 也可以通过直接创建匿名或非匿名对象达到这样的目的。

--

void List<T>.add() 因为返回值是 void,是不可能实现链式调用的,你需要的是一个 List<T> List<T>.add() 这样的扩展方法才行。现成可以用的应该是 IEnumerable<T> Enumerable.Concat<T>
geelaw
2020-10-03 20:58:22 +08:00
很简单,使用一个 struct 包装之,在优化全开的情况下可以做到零额外开销:

public static class Helper
{
public struct FluentList<T>
{
public readonly List<T> List;
public FluentList(List<T> that) { List = that; }
public FluentList<T> Add(T item) { List.Add(item); return this; }
// Add other methods as needed.
}
public static FluentList<T> AsFluent<T>(this List<T> that) { return new FluentList<T>(that); }
}

// Consumer
var list = new List<int>().AsFluent().Add(1).Add(2).List;

另外生成无限默认值比较好的方法是自己写一个实现,很简单:

public sealed class InfiniteStream<T> : IEnumerable<T>, IEnumerator<T>
{
public InfiniteStream<T> GetEnumerator() { return this; }
public IEnumerator<T> IEnumerable<T>.GetEnumerator() { return this; }
public IEnumerator IEnumerable.GetEnumerator() { return this; }

public void Reset() { }
public bool MoveNext() { return true; }
public T Current { get { return default(T); } }
public object IEnumerator.Current { get { return default(T); } }
public void Dispose() { }

private InfiniteStream() { }
public static readonly InfiniteStream<T> Instance = new InfiniteStream<T>();
}

如果需要也可以写一个 struct 版本的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/687188

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX