えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

Linqはすごい? その1

Linqはすごいと信じ込まされているあなた以下のプログラムを見てください。

どちらが簡単で分かりやすくてなおかつ速いのでしょうか?

 

var al = new[] {

    new {Name="hnaka",ZipCode="553-0001",Prefecture="大阪府"},

    new {Name="hkodama",ZipCode="168-0064",Prefecture="東京都"}

};

 

{

    var accounts = from a in al

                   where a.ZipCode == "168-0064"

                   select new { Name = a.Name, ZipCode = a.ZipCode };

    Console.WriteLine("C#3.0 クエリ式");

    foreach (var account in accounts)

        Console.WriteLine(account.Name + "(" + account.ZipCode + ")");

}

 

{

    Console.WriteLine("For Loop");

    foreach (var a in al)

        if (a.ZipCode == "168-0064")

            Console.WriteLine(a.Name + "(" + a.ZipCode + ")");

}

投稿日時 : 2008年1月24日 1:17

コメントを追加

# re: Linqはすごい? その1 2008/01/24 2:07 えムナウ

Linqのほうが速いという実験結果もありますね。

# re: Linqはすごい? その1 2008/01/24 7:10 NyaRuRu

select new { Name = a.Name, ZipCode = a.ZipCode };

select new { a.Name, a.ZipCode };
でも OK ですね.

# re: Linqはすごい? その1 2008/01/24 9:46 シャノン

> foreach (var a in al)

は、

foreach (var account in al)

にすると、見た目上、ちょっとだけ公平かも。

# re: Linqはすごい? その1 2008/01/24 10:22 Streetw☆

クエリ式の方は、対象を絞り込んでからじっくり料理wって印象なので、accountsという変数名をaccountsInTokyoとかにすると、わかりやすさが大きく違ってくると思います。よね?w

select a;
ってすると、やっぱり効率悪いですか?

# re: Linqはすごい? その1 2008/01/24 11:47 siokoshou

メソッドベースも仲間に入れてやってください。

var accounts = al.Where( a => a.ZipCode == "168-0064" );

私としてはこの場合 if 文よりもメソッドベースがスッキリして見えます(newしてませんが)。
でもわかりやすさはケースバイケースですね。if 文が複雑になると従来の手続き型のほうがわかりやすいことが多いように思います。

LINQ to Object の速い遅いについてはほとんどのケースで遅いだろうけど、CPUはナノ秒単位で動いてるんだと自分に言い聞かせて気にしないようにしてますw
昔は関数コールが遅くなると気にしてた時代があったようですが、そこで踏みとどまっていたらプログラムにできることは今よりもっと原始的だったろうなぁと思います。デニスリッチーが関数コールは遅くないとだまして回ったそうです。

# re: Linqはすごい? その1 2008/01/24 12:36 えムナウ

>NyaRuRuさん
OKです。

>シャノンさん
from a in al なので var a in al なのです。

>Streetw☆さん
>対象を絞り込んでからじっくり料理
じゃ、var じゃメソッドないしか使えないので、
メソッドないでのじっくりで大したことないですよね。
>select a;
今回は a.Name, a.ZipCode しか使わない設定なので。

>siokoshouさん
>メソッドベースも仲間に入れてやってください。
あわてないあわてない。その1とあるので今回は・・・。
>LINQ to Object の速い遅いについてはほとんどのケースで遅いだろうけど
結構速いですよ、やってみてください。
forで1000回くらい回せばわかります。

# re: Linqはすごい? その1 2008/01/24 12:58 nsharp@必死なレス

はじめまして。( ゚д゚)ノ

いまひとつ趣旨を理解できてないのですが、

> select new { Name = a.Name, ZipCode = a.ZipCode }

LINQの方だけ抽出するフィールドを絞り込んでるのはどういう意図なのでしょう(´・ω・`)?

つまり、上と下とではプログラムの意味が違うわけですよね。

で、その状態でどちらが簡単で速いかという議論になると、
それは意味的に単純な方(この例では下の方)としか言いようがありませんし、
それはLINQであることとは何の関係もないと思うのですが・・・。

わかりやすさについては主観のぶつかり合いになるのでパスします。w

# re: Linqはすごい? その1 2008/01/24 13:08 えムナウ

>LINQの方だけ抽出するフィールドを絞り込んでるのはどういう意図なのでしょう(´・ω・`)?
>つまり、上と下とではプログラムの意味が違うわけですよね。
今までのfor Loopは絞り込むことはしづらかったというかしなかったわけです。
LINQは使うものだけ絞り込むことのほうが自然なわけでそうしています。

>で、その状態でどちらが簡単で速いかという議論になると、
速いという議論は一つ目のレスで捨てています。

select new { Name = a.Name, ZipCode = a.ZipCode } を select a にしてもいいですよ。
それで簡単さがどのくらいUPしますか?

# re: Linqはすごい? その1 2008/01/24 13:58 nsharp

> 速いという議論は一つ目のレスで捨てています。

あらま。そうなると、こちらが言おうとしてたことも総くずれです・・・。(ノД`)

> それで簡単さがどのくらいUPしますか?

C#のクエリー構文においてはほとんど変わりませんね。(VBと違って、select句はどうやっても省けませんから。)
でも、メソッドベースにすれば・・・ってのはその2以降を待てとの話ですね。

# re: Linqはすごい? その1 2008/01/24 15:04 Streetw☆

私も必死にレスしてみますw
エントリの主旨から外れてごめんなさい。

> メソッドないでのじっくりで大したことないですよね
alの中身とselectのところを匿名型にしないときは、メソッドの外でもじっくりできそうです。

それと私のコメントですけど、alの中身が参照型の場合は、"select a"ってしてもメモリが無駄になったりしなさそうでした。

# re: Linqはすごい? その1 2008/01/24 15:15 えムナウ

>alの中身とselectのところを匿名型にしないとき
こんな感じ?
これってどの位おいしいのかな?

public class Account
{
 public string Name { get; set; }
 public string ZipCode { get; set; }
 public string Prefecture { get; set; }
};

IEnumerable<Account> method()
{
 IEnumerable<Account> accounts = ...
 return accounts;
}

# re: Linqはすごい? その1 2008/01/24 15:25 えムナウ

>alの中身が参照型の場合は、"select a"ってしてもメモリが無駄になったりしなさそうでした。

a の中身(項目)が仮に30個あったとして2個しか必要なくても、30個取得できるようにすべきってという話ですか?

それとも、メモリが無駄だったり時間の無駄だったりは少ないですよ、との案内で、実際は2個がいいよねってご意見ですか?

# re: Linqはすごい? その1 2008/01/24 16:35 Streetw☆

遅くなりました~

>これってどの位おいしいのかな?
Accountクラスはすでにアプリ内で作成済みとして、
メソッド名がGetAccountsInTokyo()でしたら、中身が単なるLinqだけでもおいしくないですか?
条件を隠蔽できますから。
#料理下手なので自身はないですけどorz

それと、逆に、
var accountsInTokyo = from ・・・;
ShowAccountList(accountsInTokyo);
のように、何かの処理を他のメソッドにしてもらうこともあると思います。

>すべきってという話ですか?
すべきってことじゃないです。
無駄はなさそうなので、見た目がシンプルな"select a"でもいいかな♪ってことでした。
それともう一つ思いつきました。
"select a"のままでしたら、結果に対してAccountクラスとしての操作ができる点もメリットになると思います。
そのままメソッドとか使えちゃいますから。

>実際は2個がいいよねってご意見ですか?
最初はそうかもって思いましたが、違ってきました(^^;

でも、Linq to SQLだった場合は、話が変わるのかもしれません。。。また調べます~

# re: Linqはすごい? その1 2008/01/24 16:49 えムナウ

>Accountクラスはすでにアプリ内で作成済み
実はこのケースが多いんじゃないかと思っています。
またはデータはAccountクラスだけどサブセットが必要とか・・・
Linq to SQLもテーブルはクラスですから。

# re: Linqはすごい? その1 2008/01/24 17:32 siokoshou

>あわてないあわてない。その1とあるので今回は・・・。
あらw ワクテカしながら待ちます。

>>LINQ to Object の速い遅いについてはほとんどのケースで遅いだろうけど
>結構速いですよ、やってみてください。
数倍程度の差でしかないですね。それが速いか遅いかはそれぞれなのでパスします。

ところで、LINQのほうが速いケースってのに興味があります。LINQ to SQL でしょうか?これもワクテカしながら待ちます(^^)

# Linqはすごい? その3 2008/01/25 15:15 えムナウ Blog

Linqはすごい? その3

# re: Linqはすごい? その1 2008/01/25 17:55 Streetw☆

調べてきました~

>Linq to SQLもテーブルはクラスですから。
クラスなんですけど、ちょっと違いました。

LINQ to SQLだと、
"select a;" と
"select new { Name = a.Name, ZipCode = a.ZipCode };"
とで、発行されるSQL文が違いました。
前者は全項目がSELECT句にリストされるけど、
後者ではNameとZipCodeだけがリストされました。
#他に遅延取得の指定とかもあるらしく、奥が深いです。。

ケースバイケースで使い分けたいと思います。

# re: Linqはすごい? その1 2008/01/25 18:04 えムナウ

>発行されるSQL文が違いました。
ありがとうございます。
実は知っていました。

DataContext.Log プロパティ を使うと便利ですよ。

# Linqはすごい? その3 2008/01/25 21:19 えムナウ Blog

Linqはすごい? その3

# Linqはすごい? その5 2008/01/27 15:47 えムナウ Blog

Linqはすごい? その5

# Linqはすごい? その5 2008/01/27 16:19 えムナウ Blog

Linqはすごい? その5

# re: Linq????? ??1 2021/08/07 1:17 hydroxychlorquine

chroloquine https://chloroquineorigin.com/# hydroxychloroquine sulfate tabs 200mg

# hydroxychloroquine generic names 2022/12/25 12:01 MorrisReaks

http://www.hydroxychloroquinex.com/# chloroquine for sale

タイトル
名前
URL
コメント