ScalaでArray(1, 2, 3, 1).groupBy(i => i)みたいに書いてる場合はidentityを使うと良い
// (1) これは... Array(1, 2, 3, 1).groupBy(i => i) // (2) こう書ける(意味は同じだけどスッキリ!) Array(1, 2, 3, 1).groupBy(identity)
最初は↓のように書いていたのですが、コンパイルが通らず、結局上記(1)のように書いていました。
Array(1, 2, 3, 1).groupBy(_)
よくよく考えると関数が期待されている部分に値をそのまま渡しているので当然ですね。
うーんでもこの書き方は冗長だなあ...と思って調べていたら
Scala 異なるものを検索する実験(Hishidama's Scala different search Memo)
神のブログに解決策が載っていました!
しかもまったく同じ間違い方してるw
Scalaに標準で用意されているidentity
という関数は渡された引数をそのまま返す関数なのでこのようなケースで使えるというわけですね。
普段仕事で使ってるC#にもこういうのないのかな?と思ったんですが、自分で作ってstatic importすれば同じように使えそうですね。
ということで作ってみました。
namespace DotnetPlayground { public static class Predef { public static T Identity<T>(T p) { return p; } } }
using System; using System.Collections.Generic; using System.Linq; // static importしておく using static DotnetPlayground.Predef; namespace DotnetPlayground { class Program { static void Main(string[] args) { var ints = new List<int> { 1, 2, 3, 1 }; var grouped = ints .GroupBy(Identity) // Scalaと同じように書ける! .ToList(); var result = grouped.Select(i => $"{i.Key}: {i.Count()}"); Console.WriteLine(string.Join("\n", result)); /* Result 1: 2 2: 1 3: 1 */ } } }