【C#】再入門 Linq to Objects (5) 「predicate」もつメソッドを分類

  • 2013.01.29 Tuesday
  • 21:05
JUGEMテーマ:コンピュータ

System.Linq.Enumerableクラス内でpredicateという引数をもつメソッドを分類してみたいと思います。predicateを抽出する方法はこちらで実装しました(【C#】再入門 Linq to Objects (4) 「predicat」という引数名を持つメソッドを探してみる。

■フィルター系
predicateに基づいて何らかのシーケンスを返すメソッド
Where、TakeWhile、SkipWhile

 IEnumerable<TSource> Where(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 IEnumerable<TSource> Where(this IEnumerable<TSource> source, Func<TSource, Int32, Boolean> predicate)
 IEnumerable<TSource> TakeWhile(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 IEnumerable<TSource> TakeWhile(this IEnumerable<TSource> source, Func<TSource, Int32, Boolean> predicate)
 IEnumerable<TSource> SkipWhile(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 IEnumerable<TSource> SkipWhile(this IEnumerable<TSource> source, Func<TSource, Int32, Boolean> predicate)


■一個だけ抽出系
predicateに基づいて特定の要素を返すメソッド
First、FirstOrDefault、Last、LastOrDefault、Single、SingleOrDefault

 TSource First(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource FirstOrDefault(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource Last(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource LastOrDefault(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource Single(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource SingleOrDefault(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)

■判定系
predicateに基づいてBooleanを返すメソッド
Any、All

 Boolean Any(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 Boolean All(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)

■カウンター系
predicateに基づいてカウントを返すメソッド
Count、LongCount

 Int32 Count(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 Int64 LongCount(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
----------------

シグニチャの対称性よくデザインされているため結構綺麗に分類でき、何をするものか予測しやすいですね。

【C#】再入門 Linq to Objects (4) 「predicate」という引数名を持つメソッドを探してみる。

  • 2013.01.29 Tuesday
  • 20:50
JUGEMテーマ:コンピュータ

 「predicate」という引数を持つメソッドを探してみました。

System.AggregateException
 Void Handle(Func<Exception, Boolean> predicate)
----------------
SingleProducerSingleConsumerQueue<>
 Boolean TryDequeueIf(Predicate<T> predicate, T& result)
----------------
System.Diagnostics.Contracts.Contract
 Boolean ForAll(IEnumerable<T> collection, Predicate<T> predicate)
 Boolean ForAll(Int32 fromInclusive, Int32 toExclusive, Predicate<Int32> predicate)
 Boolean Exists(Int32 fromInclusive, Int32 toExclusive, Predicate<Int32> predicate)
 Boolean Exists(IEnumerable<T> collection, Predicate<T> predicate)
----------------
System.Linq.Queryable
 IQueryable<TSource> Where(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 IQueryable<TSource> Where(this IQueryable<TSource> source, Expression<Func<TSource, Int32, Boolean>> predicate)
 IQueryable<TSource> TakeWhile(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 IQueryable<TSource> TakeWhile(this IQueryable<TSource> source, Expression<Func<TSource, Int32, Boolean>> predicate)
 IQueryable<TSource> SkipWhile(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 IQueryable<TSource> SkipWhile(this IQueryable<TSource> source, Expression<Func<TSource, Int32, Boolean>> predicate)
 TSource First(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 TSource FirstOrDefault(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 TSource Last(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 TSource LastOrDefault(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 TSource Single(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 TSource SingleOrDefault(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 Boolean Any(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 Boolean All(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 Int32 Count(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
 Int64 LongCount(this IQueryable<TSource> source, Expression<Func<TSource, Boolean>> predicate)
----------------
System.Linq.Enumerable
 IEnumerable<TSource> Where(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 IEnumerable<TSource> Where(this IEnumerable<TSource> source, Func<TSource, Int32, Boolean> predicate)
 IEnumerable<TSource> TakeWhile(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 IEnumerable<TSource> TakeWhile(this IEnumerable<TSource> source, Func<TSource, Int32, Boolean> predicate)
 IEnumerable<TSource> SkipWhile(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 IEnumerable<TSource> SkipWhile(this IEnumerable<TSource> source, Func<TSource, Int32, Boolean> predicate)
 TSource First(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource FirstOrDefault(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource Last(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource LastOrDefault(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource Single(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 TSource SingleOrDefault(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 Boolean Any(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 Boolean All(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 Int32 Count(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
 Int64 LongCount(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
----------------
Iterator<>
 IEnumerable<TSource> Where(Func<TSource, Boolean> predicate)
----------------
WhereEnumerableIterator<>
 IEnumerable<TSource> Where(Func<TSource, Boolean> predicate)
----------------
WhereArrayIterator<>
 IEnumerable<TSource> Where(Func<TSource, Boolean> predicate)
----------------
WhereListIterator<>
 IEnumerable<TSource> Where(Func<TSource, Boolean> predicate)
----------------
WhereSelectEnumerableIterator<>
 IEnumerable<TResult> Where(Func<TResult, Boolean> predicate)
----------------
WhereSelectArrayIterator<>
 IEnumerable<TResult> Where(Func<TResult, Boolean> predicate)
----------------
WhereSelectListIterator<>
 IEnumerable<TResult> Where(Func<TResult, Boolean> predicate)
----------------
System.Linq.ParallelEnumerable
 ParallelQuery<TSource> Where(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 ParallelQuery<TSource> Where(this ParallelQuery<TSource> source, Func<TSource, Int32, Boolean> predicate)
 Int32 Count(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 Int64 LongCount(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 Boolean Any(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 Boolean All(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 ParallelQuery<TSource> TakeWhile(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 ParallelQuery<TSource> TakeWhile(this ParallelQuery<TSource> source, Func<TSource, Int32, Boolean> predicate)
 ParallelQuery<TSource> SkipWhile(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 ParallelQuery<TSource> SkipWhile(this ParallelQuery<TSource> source, Func<TSource, Int32, Boolean> predicate)
 TSource First(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 TSource FirstOrDefault(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 TSource Last(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 TSource LastOrDefault(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 TSource Single(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
 TSource SingleOrDefault(this ParallelQuery<TSource> source, Func<TSource, Boolean> predicate)
----------------

対象となったアセンブリは、Visual Studio 2012 .NetFramework 4.5でコンソールアプリのプロジェクトを作成したときにデフォルトで設定される参照が対象です。
ヒットしたメソッドのほとんどがフィルターの機能を実装しているメソッドだと予測されます。違う顔無性もありますが・・・。

いっぱいだー!

以下コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace Art55.PredicateDemo20130129_001
{
    class Program
    {
        static void Main(string[] args)
        {
            AppDomain
                .CurrentDomain
                .GetAssemblies()
                .SelectMany(aassebly => aassebly.GetTypes())
                .SelectMany(type => type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.Instance))
                .Where(methodInfo => methodInfo.GetParameters().Any(pInfo => pInfo.Name == "predicate"))
                .GroupBy(methodInfo => methodInfo.ReflectedType)
                .ToList()
                .ForEach(info =>
                    {
                        Console.WriteLine(DisplayTypeUtils.ConvertToVisualType(info.Key, true));
                        info
                            .Select(DisplayTypeUtils.ConvertToVisualMethodInfo)
                            .ToList()
                            .ForEach(method => Console.WriteLine(" {0}", method));
                        Console.WriteLine("----------------");
                    });
        }
    }
    static class DisplayTypeUtils
    {
        public static string ConvertToVisualMethodInfo(MethodInfo methodInfo)
        {
            string returnTypeName = ConvertToVisualType(methodInfo.ReturnType, false);
            string methodName = methodInfo.Name;
            bool isExtension = methodInfo.IsDefined(typeof(ExtensionAttribute), true);
            var methodParameters = methodInfo
                .GetParameters()
                .Select(parameterInfo => string.Format("{0} {1}",
                                                       ConvertToVisualType(parameterInfo.ParameterType, false),
                                                       parameterInfo.Name));
            return string.Format("{0} {1}({2}{3})",
                returnTypeName,
                methodName,
                (isExtension ? "this " : string.Empty),
                string.Join(", ", methodParameters));
        }
        public static string ConvertToVisualType(Type type, bool isFullName)
        {
            return type.IsGenericType ?
                ConvertToVisualGenericTpye(type, isFullName)
                : (isFullName ? type.FullName : type.Name);
        }
        static string ConvertToVisualGenericTpye(Type type, bool isFullName)
        {
            var genericTypeArguments = type
                .GenericTypeArguments
                .Select(t => ConvertToVisualType(t, isFullName));
            return string.Format("{0}<{1}>", type.Name.Split('`')[0], string.Join(", ", genericTypeArguments));
        }
    }
}

【C#】再入門 Linq to Objects (3) 「Where」MSDNライブラリーを読んで見る。

  • 2013.01.27 Sunday
  • 19:27
JUGEMテーマ:コンピュータ

今回はWhereメソッドについて取り上げたいと思います。

Whereメソッドのオーバーロードは2つあります。

IEnumerable<TSource> Where(this IEnumerable<TSource> source, Func<TSource, Boolean> predicate)
IEnumerable<TSource> Where(this IEnumerable<TSource> source, Func<TSource, Int32, Boolean> predicate)

見比べると第二引数のpredicateの型であるFuncに違いがあることが分かります。とりあえず、メソッドのシグニチャから大体想像できそうなメソッドですが、もう少し正確なところを知りたいのでMSDNライブラリーを眺めてみることにしてみます。

Enumerable.Where メソッド
述語に基づいて値のシーケンスをフィルター処理します。
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
述語に基づいて値のシーケンスをフィルター処理します。
Where<TSource>(IEnumerable<TSource>, Func<TSource, Int32, Boolean>)
述語に基づいて値のシーケンスをフィルター処理します。各要素のインデックスは、述語関数のロジックで使用されます。

http://msdn.microsoft.com/ja-jp/library/system.linq.enumerable.where.aspx

predicateを日本語の対応する意味は「述語」なので、MSDNに記述されている「述語」はpredicateの事だと思います。「predicateに基づいて値のシーケンスをフィルター処理します。」と書いてくれた方が、意図が通じやすいような気もしますが・・・。ちなみにpredicateは「各要素が条件を満たしているかどうかをテストする関数。」だそうです。

MSDNを読む限り、このメソッドは第一引数で指定したシーケンスに対して、predicateに基づいてフィルター処理を実行し、フィルターを抜けた要素のシーケンスを返すメソッドだと言うことがわかります。オーバーロードによってフィルターを通過するときの情報が要素の場合と要素とその要素のインデックスの組である場合の2通りがあると言っているようです。

【C#】再入門 Linq to Objects (2) どのような拡張メソッドがあるかを確認する。(2)

  • 2013.01.27 Sunday
  • 17:38
JUGEMテーマ:コンピュータ

【C#】再入門 Linq to Objects (1) どのような拡張メソッドがあるかを確認する。

上記の投稿で、System.Linq.Enumerableに定義されているpublicなメソッド名の一覧を取得してみました。しかしながらよくよく考えてみると、メソッド名だけではニュアンスぐらいしか分からず、情報不足だと感じるので、今回はシグニチャも含めて一覧にしてみたいと思います。

・・・と思ったのですが、いっぱいありすぎてブログのスペースには収まりきらなかったので、取得するために書いたコードを公開します。取得した結果は、それぞれのメソッドを見るときにでも

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text;
namespace ConsoleApplication29
{
    class Program
    {
        static void Main()
        {
            typeof (Enumerable)
                .GetMethods(BindingFlags.Public | BindingFlags.Static)
                .Select(DisplayTypeUtils.ConvertToVisualMethodInfo)
                .ToList()
                .ForEach(Console.WriteLine);
        }
    }
    static class DisplayTypeUtils
    {
        public static string ConvertToVisualMethodInfo(MethodInfo methodInfo)
        {
            string returnTypeName = ConvertToVisualType(methodInfo.ReturnType);
            string methodName = methodInfo.Name;
            bool isExtension = methodInfo.IsDefined(typeof(ExtensionAttribute), true);
            var methodParameters = methodInfo
                .GetParameters()
                .Select(parameterInfo => string.Format("{0} {1}",
                                                       ConvertToVisualType(parameterInfo.ParameterType),
                                                       parameterInfo.Name));
            return string.Format("{0} {1}({2}{3})",
                returnTypeName,
                methodName,
                (isExtension ? "this " : string.Empty),
                string.Join(", ", methodParameters));
        }
        static string ConvertToVisualType(Type type)
        {
            return type.IsGenericType ?
                ConvertToVisualGenericTpye(type)
                : type.Name;
        }
        static string ConvertToVisualGenericTpye(Type type)
        {
            var genericTypeArguments = type
                .GenericTypeArguments
                .Select(ConvertToVisualType);
            return string.Format("{0}<{1}>", type.Name.Split('`')[0], string.Join(", ", genericTypeArguments));
        }
    }
}

「記事の続き」機能を使えば、制限なく書けるようなので出力結果はそちらに書きます。
出力結果の件数は175件、結構あります。これにParallelも含めたりすると、約2倍より少なめ程度になるんでしょうか・・・とにかくいっぱいあります。
続きを読む >>

【C#】再入門 Linq to Objects (1) どのような拡張メソッドがあるかを確認する。

  • 2013.01.27 Sunday
  • 15:39
JUGEMテーマ:コンピュータ

「再入門 Linq to Objects 」はじめました。体系立てて理解するというのが目的です。誤解のないように説明を加えると、このブログで体系立てて説明する気はありません。体系立てて理解するのは私であって、現状は体系だてて説明できないのです。そういう事です。後は察していただければ幸いです。

今回は

System.Linq.Enumerableクラスに存在するpublicなメソッドの一覧を確認したいと思います。Linq to Objectでは、これらのメソッドを組み合わせてロジックを組んだりするので、とりあえず全部知っておけば、いいじゃないかというのが目論見です。

リフレクションを使って確認してみたところ、メソッド名は以下の通りありました。

Where
Select
SelectMany
Take
TakeWhile
Skip
SkipWhile
Join
GroupJoin
OrderBy
OrderByDescending
ThenBy
ThenByDescending
GroupBy
Concat
Zip
Distinct
Union
Intersect
Except
Reverse
SequenceEqual
AsEnumerable
ToArray
ToList
ToDictionary
ToLookup
DefaultIfEmpty
OfType
Cast
First
FirstOrDefault
Last
LastOrDefault
Single
SingleOrDefault
ElementAt
ElementAtOrDefault
Range
Repeat
Empty
Any
All
Count
LongCount
Contains
Aggregate
Sum
Min
Max
Average

「大体、一度は使ったことがあるなー」というのが感想です。恥ずかしながらJoinとGroupJoinは使ったことがありません。SequenceEqualとLongCountとContainsも使ったことがありません。
Conncatを使うべきところをUnionを使ってしまった事があるなーっとか、全て感想です。

今回はここまでです。次からは上から順番に見ていこうと思います。オーバーロードが沢山ありそうなので、大変な気がしてきました。うーん。

-----------------------
参考までにコードを載せておきます。

using System;
using System.Linq;
using System.Reflection;

namespace ConsoleApplication29
{
    class Program
    {
        static void Main()
        {
            var enumerableType = typeof (Enumerable);
            enumerableType
                .GetMethods(BindingFlags.Public | BindingFlags.Static)
                .Select(info => info.Name)
                .Distinct()
                .ToList()
                .ForEach(Console.WriteLine);
        }
    }
}

【C#】Linq to Objectsを再入門

  • 2013.01.27 Sunday
  • 14:58
JUGEMテーマ:コンピュータ

Linq to Objectsに関して、使うより慣れろっと言ったかんじの「ノリ」で今までやってきたのですが、いざ人様に使い方を教えなくちゃいけないという状況になった場合に、体系だったものが全くなく途方に暮れているというのが、最近の現状です。

ということで再入門じゃー!てか「式ツリー」というのが今だにチンプンカンプン。

と、書くと大抵の場合、途中で挫折する・・・パターンなのですが・・・

【C#】Linq to Objects禁止ってあるんですねー。

  • 2013.01.26 Saturday
  • 18:15

Linq to Objects 禁止というコーディングルールを適用させる組織ってあるんですね。

「悲しい事実だけど人類はまだその段階に至っていないのだ」

なのかー。

【C#】Linq to Objectを使う利点。

  • 2012.11.05 Monday
  • 02:09
JUGEMテーマ:コンピュータ
 
Linqで書いたコードは、サクッと捨てられます。これって結構嬉しいことだと思います。

【LINQ】Anyメソッドを使えば良いところを・・・

  • 2012.06.07 Thursday
  • 00:58
JUGEMテーマ:コンピュータ
 
昔、書いたコードに
Anyメソッドを使えば良いところを、

.Count() > 0
 
と書いている箇所を発見したので、
証拠隠滅しておいた。

【Book】プログラミングMicrosoft LINQ

  • 2009.10.08 Thursday
  • 22:16
プログラミングMicrosoft LINQ (マイクロソフト公式解説書 Microsoft Visual Studi)
プログラミングMicrosoft LINQ (マイクロソフト公式解説書 Microsoft Visual Studi)
小高 太郎,(株)オーパス・ワン


数ヶ月前に購入して、これはおもしろそうだ!って思いつつも本の山の中に・・・最近、やる気が戻りつつあるので、読もうと思います。

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      
<< March 2024 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【WPF】DataGridに編集可能なComboBoxを表示するには?
    art55 (07/16)
  • 【WPF】DataGridに編集可能なComboBoxを表示するには?
    arisa (07/16)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM