C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: LINQでの処理


(過去ログ 139 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■81464 / inTopicNo.1)  LINQでの処理
  
□投稿者/ furu (68回)-(2016/09/26(Mon) 18:41:26)

分類:[C#] 

VS2012 C#2012

いつも大変お世話になっております。

遅まきながら、LINQを勉強し始めました。

LINQでデータを抽出できるのはわかりましたが
抽出したデータを処理(出力)するのに
どのメソッドを使用すればよいかわかりません。

foreachで処理するしかないのでしょうか?

例えば、5個の乱数を表示したい場合

    var r = new Random();
    var q = Enumerable.Range(1, 5).Select(x => r.Next());
    
    //方法1
    foreach (var x in q)
    {
        MessageBox.Show(x.ToString());
    }
    
    //方法2
    q.Max(x => {MessageBox.Show(x.ToString()); return x;});

方法2のMaxに変わるような
  ループを回してくれて
  voidを返す(引数はAction)
メソッドはないですか?

引用返信 編集キー/
■81465 / inTopicNo.2)  Re[1]: LINQでの処理
□投稿者/ Hongliang (460回)-(2016/09/26(Mon) 18:49:20)
自分でそういう拡張メソッドを書けばいいです。
が、個人的には、LINQは基本的には最終的にforeachすることで完結するものと思っています。
引用返信 編集キー/
■81466 / inTopicNo.3)  Re[2]: LINQでの処理
□投稿者/ furu (70回)-(2016/09/26(Mon) 19:00:58)
No81465 (Hongliang さん) に返信
> 自分でそういう拡張メソッドを書けばいいです。

こういうことですか?

    q.Execute(x => {MessageBox.Show(x.ToString());});

    static class doudemoii
    {
        public static void Execute<T>(this IEnumerable<T> source, Action<T> action)
        {
            foreach (var element in source) {
                action(element);
            }
        }
    }

引用返信 編集キー/
■81467 / inTopicNo.4)  Re[1]: LINQでの処理
□投稿者/ Azulean (715回)-(2016/09/26(Mon) 22:06:08)
2016/09/26(Mon) 22:07:02 編集(投稿者)

List<T> を介してもよいなら、enumerable.ToList().ForEach(...) も手ですけどね。
https://msdn.microsoft.com/ja-jp/library/bwabdf9z


// List<T> でメモリ消費するので、少量の要素のみに限りましょう
// enumerable が大量の要素ならメモリなどの無駄になるため
引用返信 編集キー/
■81471 / inTopicNo.5)  Re[2]: LINQでの処理
□投稿者/ furu (72回)-(2016/09/27(Tue) 09:41:52)
No81467 (Azulean さん) に返信

> List<T> を介してもよいなら、enumerable.ToList().ForEach(...) も手ですけどね。

ForEachのような仮想メソッドがあればと思ったのですが
ないようですね。

ToList()などだと、メモリもそうですが
遅延評価のメリットが無くなるので止めときます。

Hongliangさん,Azuleanさん、ありがとうございました。
解決済み
引用返信 編集キー/
■81474 / inTopicNo.6)  Re[1]: LINQでの処理
□投稿者/ 魔界の仮面弁士 (914回)-(2016/09/27(Tue) 10:30:12)
No81464 (furu さん) に返信
> 方法2のMaxに変わるような
>   ループを回してくれて
>   voidを返す(引数はAction)
> メソッドはないですか?

Func<> で良いなら、Min/Max/All/Any ですが、
どうしても Action<> でやりたいのなら、
 q.AsParallel().WithDegreeOfParallelism(1).ForAll( yourAction );
という手があります。無理矢理ですけど。


> 遅延評価のメリットが無くなるので止めときます。
この場合は、遅延評価というよりは順次評価ですかね。

今回の目的で ToArray/ToList を使うのは、メリットが薄れるという点は同意です。
拡張メソッドを自作しておくか、素直に foreach で呼んだ方が良さそうですね。
引用返信 編集キー/
■81480 / inTopicNo.7)  Re[2]: LINQでの処理
□投稿者/ furu (73回)-(2016/09/27(Tue) 21:33:52)
No81474 (魔界の仮面弁士 さん) に返信
> Func<> で良いなら、Min/Max/All/Any ですが、

これらだと、後でコードを見た人(将来の自分)に
気持ちが伝わらないので、使いたくありません。


> どうしても Action<> でやりたいのなら、
>  q.AsParallel().WithDegreeOfParallelism(1).ForAll( yourAction );
> という手があります。無理矢理ですけど。

いや、そういうものがあれば、使うといった程度です。

> この場合は、遅延評価というよりは順次評価ですかね。

そうですか。

今までのプログラムと同じロジック(流れ?)で動くと
LINQに書き換えても違和感ないけど
ToList()を使うと、全然違った処理に感じてしまいますし、
「10分経ったけど、処理を続けますか?」が書けません。


> 拡張メソッドを自作しておくか、素直に foreach で呼んだ方が良さそうですね。

foreachで始めてみます。

解決済み
引用返信 編集キー/
■81484 / inTopicNo.8)  Re[3]: LINQでの処理
□投稿者/ 魔界の仮面弁士 (916回)-(2016/09/28(Wed) 12:07:07)
No81480 (furu さん) に返信
> いや、そういうものがあれば、使うといった程度です。

要望はあるみたいですね。こんな記事がありました。
https://blogs.msdn.microsoft.com/ericlippert/2009/05/18/foreach-vs-foreach/

関連して、こんな意見も。
http://qiita.com/chocolamint/items/d29d699ce27bcf685154


> ToList()を使うと、全然違った処理に感じてしまいますし、
> 「10分経ったけど、処理を続けますか?」が書けません。

10分経過した時点で、外部から列挙処理を停止させたいのでしょうか。
あるいは LINQ での列挙中に継続確認して、
yield break させるようなイメージでしょうか?

でも、ラムダ式や匿名メソッドの中では yield が使えないはず…。


もしも ForEach が用意されていたとして、それには継続確認が
行えるような仕組みも組み込まれていて欲しい、という話なのだとしたら、
それは Action ではなく Func<bool> 等で実装されるかも知れません。
.All や .Any のように。
解決済み
引用返信 編集キー/
■81487 / inTopicNo.9)  Re[4]: LINQでの処理
□投稿者/ furu (74回)-(2016/09/28(Wed) 20:19:27)
No81484 (魔界の仮面弁士 さん) に返信

> でも、ラムダ式や匿名メソッドの中では yield が使えないはず…。

基本的なことを忘れていました。
やはり、foreachでないとやりたいことが自由にできないですね。

> 関連して、こんな意見も。
> http://qiita.com/chocolamint/items/d29d699ce27bcf685154

List<T>.ForEach メソッドは使うべきでない理由の

  デリゲート呼び出しのコストがかかる

は、LINQのほとんどすべての仮想メソッドに当てはまることだと思います。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -