하나 :하는 catamorphism이 다른 모든 루프는 (또한 fold
라고 , reduce
, inject:into:
또는 inject
). 이것은 또한 여기에 해당됩니다.
sortedDictionary.Aggregate(mSortedDictionary, (d, e) => {
d.Add(e.Key, Transform(e.Value)); return d; });
참고 : 고맙게도 LINQ 사업자 중 하나는 마이크로 소프트가 Aggregate
를 호출 우리에게 catamorphism는 제공이는 더 K의 콤비와 destructuring 바인딩을 사용하여 간단하게 할 수있다. 불행히도, 나는 BCL에서 K 결합자를 찾을 수 없었습니다. 비록 내가 어쩌면 에이있을 것이라고 확신합니다. (아무도 모른다면 나에게 말해주세요.)
이 예제의 목적을 위해, 나는 자신의 K 결합기를 제공 할 것이고, 나는 그것이라고 불리는 것보다 다른 어떠한 이유로도 Tap
이라고 부를 것이다. Ruby :
public static T Tap<T>(this T o, Action<T> f) { f(o); return o; }
말 그대로 문자 그대로입니다. (글쎄, 당신이 스레드 안전 및 예외 중 & hellip 무시 적어도 경우;)을 K 연결자를 사용
을, 우리는이에 도착 : 눈에 훨씬 더 쉽게
sortedDictionary.Aggregate(mSortedDictionary, (d, e) => d.Tap(dd =>
dd.Add(e.Key, Transform(e.Value))));
합니다.
불행하게도, 우리는 스스로 결박 destructuring 추가 할 수 있지만, C#을 이 지원 destructuring 바인드를 한 경우에, 그것은 더 같을 것이다 :
sortedDictionary.Aggregate(mSortedDictionary, (d, {k, v}) => d.Tap(dd =>
dd.Add(k, Transform(v))));
[주 :이 예에서 I가 개체 초기화 구문을 사용 . 바인드를 destructuring 예를 들어
, 루비, 이이 destructuring 바인드와 K 연결자 모두가 않는, 그 결과는 다음과 같습니다
sorted_dictionary.reduce(m_sorted_dictionary) {|d, (k, v)|
d.tap {|d| d[k] = transform(v) }
}
글쎄, 나는 1 줄 대신 0 줄로 쓸 수 있다고 생각하지만, 아마도 그다지 도움이 안 될 것입니다. –
한 줄보다 짧습니까? 당신은 잘못된 것들에 대해 걱정하고 있습니다. –
당신은 변수 이름을'a','b' 등으로 바꿀 수 있고 몇 개의 문자를 저장할 수 있습니다 - 당신이해야한다는 것을 의미하지는 않습니다. 너 뭐야? 성능 -'for' 루프는'foreach'보다 빠르지 만 열거 자에 대한 트랜잭션 측면을 상실합니다 – STW