linqって何でこんなにも、とっつき難いんだろうー
SQL文と似ているけど、何か違う
814 :
デフォルトの名無しさん:2011/11/27(日) 11:40:17.03
技術者のオナニーでしょw
そういうオナニーはよくあるよ
Cの構文なんかも技術者のオナニー要素あるし
変に楽しようとするとオナニー実装しちゃうことよくある
>>813 単に慣れの問題だと思うんだ
普段慣れ親しんでいる物と違うから、とっつき難く感じる
fromキーワードとか使ってるからだろ
Where().Select()表記なら何もわかりにくいものはない
817 :
813:2011/11/27(日) 12:01:41.49
<root><user>
<name>name</name>
<sex>man</sex>
<passwd>passwd</passwd>
</user></root>
XElement element = XElement.Load(txtXmlFilePath.Text);
var query = from n in element.DescendantNodes("user")
select n;
<user>以下をすべて取り出したいんだけど、怒られちゃう
SQL文と違うやん
XElement.Parse(Text).Desendants("user")
819 :
813:2011/11/27(日) 12:23:00.81
>>818 とりあえず、動いた
ありがとう
from p in XXX
XXXには何でも書いてOK?
まずはmsdnを調べる習慣を付けよう
クエリ式は中途半端にメソッドが混じるから止めた方がいいと思うんだよねえ
中途半端に似てるせいで違いに戸惑うことの方が多いと思うんだけど
>一般に、LINQ クエリを記述する場合、可能なときは常にクエリ構文を使用し、必要に応じてメソッド構文を使用することをお勧めします。
>この 2 つの形式の間に意味および動作についての違いはありません。
>クエリ式は多くの場合、メソッド構文で記述された同等の式に比べてわかりやすくなります。
こんなこと言ってるけどさ
ハァ?って感じだよね
なにより遅いし。
分かりやすくないし
>クエリ式は多くの場合、メソッド構文で記述された同等の式に比べて誤解を招きます。
こうしよう
俺は別に判り難いと思わんがなあ
慣れてないだけじゃない?
多くの人は慣れるほど使わないかと
ILとの直交性がないからなぁ。ふつう使わないだろ。
クエリ式はfromをいっぱい並べたいときだけメソッド式より有利
830 :
デフォルトの名無しさん:2011/11/27(日) 14:20:47.83
>>813 オラクルのPro*Cも相当ひどかったが
あれと同じにおい?
最初頑張って使ってたけどメソッド式を見た瞬間に乗り換えたわ
マジで存在意義がわからん
832 :
813:2011/11/27(日) 15:13:02.31
>>827 そうだよね〜
Enterpriseじゃ未だに.NET 2.0だから、Linq覚えれないよね
仕事で使わないと実践的な使い方とか、なかなか覚えれない
>>830 SQL ServerメインだからOracleはわからん
Oracleは最近使い始めたばかりだから、まだストアド書けるレベルにもなってないもので
エンタープライズだから.NET 2.0というのは違うでしょ
自分の世界がすべてだと思わないように
Pro*Cは吐かれたソースがわけわかめでわろた
Pro*Cは単純なサンプルのソースすら汚い。
オラクルはバグが多いはずだ。
ラムダはlinqとセットで使わないとメリットがないと思うのは俺だけ?
普段使うところない気がする
今となってはdelegateの存在感が・・・
>>836 お手軽な匿名関数としての利用価値がめっちゃあるじゃん
ヘジたんはデモでLINQ使うときいっつもメソッド形式使ってるよね
お手軽っていう理由だけだと通らない現場もある。
現場ごとにあわせればいいだけの話
頭の融通が利かないのが一番悪
>>836 用意されているのでもLazyやDelegateCommand
自分で使っていくにもfactory的に引数で受けるようにしたりとか
使おうとすれば幾らでも使いどころあるよ(その辺の使い方は関数型言語の考え方を見るといいかも)
このスレでfactoryってよくきくけどなんなの?
そういう用語どこで覚えてるの?
>>836が無名関数とラムダを区別している一方で
返答者は区別せずに回答してる件
C#では () => { } と () => 式 の両方をラムダ式と呼ぶから匿名メソッドと実質的な違いはない
delegate() { } との表記の違いだけ
Expressionになるラムダを指すのなら、
LINQ以外でも式がデータとして取れるのでタイプセーフに名前を取り出したり
それとILビルダー(最後にCompileしてFuncを作る)としての役割もあるね
>>847 Prismでやってたな、それ。
protected virtual void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
protected void RaisePropertyChanged<T>(Expression<Func<T>> propertyExpression)
{
var propertyName = PropertySupport.ExtractPropertyName(propertyExpression);
this.RaisePropertyChanged(propertyName);
}
MSって基本的にクラスやメンバの名前にデザインパターンの慣用名使わないから
Javaなんかと違って知らないうちに使っててもわかりにくいんだよね
デザパタ名嫌いだからMSの方針は好みだけど
Prismなんか持ち出さんでもASP.NET MVCにあるよ
var threadSafeHandler = Interlocked.CompareExchange(ref Raised, null, null);
Livetのイベント呼び出しがこんなコードになってるけど
32bit環境なら32bitまで、64bit環境なら64bitまでの代入や取得ってアトミックだった気がするんだけど
違いました?
それはCompareとExchangeをスレッドセーフで処理するメソッドじゃね?
>>853 nullとの比較だと、元の値を変えずに取り出す事と同じになる。
Interlocked.Readの参照版が無いからこれで代替してるんだろう。
最適化を抑制してるんだろうけど、本当に必要なのかこれ
MSのコードでそんなことやってるの見たことないし、VBのRaiseEventもそんなことしてないはず
C#の言語仕様だと、データの依存関係は必ず保持されて変数の値は順番通りに計算されるとあるが
>>855 コレクションのSyncRootはComapreExchangeで生成されてるよ
CompareExchangeってダブルチェックロッキングの代替だと思ってたんだけど違うの?
>>856 そりゃうっかり2つ作っちゃったら困るからな
852はreadの代わりにしてるだけ
>>857 ダブルチェックロッキングみたいな、比較“代入”だけなら、問題にならないはず。
86系 CPU だと確かダブルチェックロッキング正常に動くって話だったと思うし、
.NET 2.0 以降のメモリモデルなら、volatile つければ他の環境でも動く保障つくはず。
CompareExchange は比較“交換”だから勝手違うと思う。
>>858 4.0 で lock(this) は消えたけど、代わりに CompareExchange 使ったパターンになったのよね?
あの CompareExchange は必要なんじゃないの?
>>860 イベントアクセサのあれは本当にcompare−>exchangeしてる
readだけの箇所にはInterlocked使ってない
じゃあ、ロックフリーな遅延初期化って
Hoge a = this.x;
if (a == null) {
a = new Hoge();
Interlocked.CompareExchange(ref this.x, a, null);
}
だけでいいの?
少なくともthis.x != nullなのに初期化が終わってない状態には
ならないと思うけど
ちと話しぶった切るけど、、、ある文字列をゼロサプレスするのに
効率的な方法ってどんなのがあるのでしょうか?
自分は一文字ずつsubstringで取得して精査する方法しか思いつかないのですが・・・
例)
00005 => 5
AB00001 => AB1
AB0000 => 0
のようにしたいです。
後ろから0検索してごにょるだけじゃないの
([A-Z]*)0*([1-9][0-9]*)?
でキャプチャしたら
AB0500はどうなるんだろう
AB0501とか
すいません、仕様を伝えていませんでした。。。先頭のゼロサプレスのみなので
AB0500=>AB500
AB0501=>AB501
になります。
全てのゼロを削除するならstr.Replace("0","");で良かったのですが・・・
正規表現使うほどのものでもないような。
substring何回も使うくらいなら、stringをchar配列にして走査したほうが早いんじゃないの
>>870 それだと2バイト文字が来るとどうにも・・・orz
こんなんはどうだろうか・・・
var str = "ABC000111000";
var index = str.IndexOfAny(new char[] { '1','2', '3', '4', '5', '6', '7', '8', '9' });
var beforeStr = str.Substring(0, index);
var afterStr = str.Substring(index);
beforeStr = beforeStr.Replace("0","");
var result = beforeStr + afterStr;
とか・・?
.NETには1バイト文字なんて存在しないぞ
>>864 AB0000 => 0
なんでゼロサプレスで "AB" が消えるの?
初心者弄り始まったな
相談者は正規表現で満足しておくべきだった
>>874 ごめんなさい
AB0000=>AB0
ですm(_ _)m
>>処理系がShift-Jisでしていたからできなかったのかなぁ、、、
その昔うまくできなくて、2バイトだからか?って思ってあきらめてた><
ひとつためになりました♪よく考えたら.NETてunicodeだもんね・・・
この件に使うかどうかは別にしても正規表現は覚えとけ
これほど学習コストが低い割に恐ろしく広く応用できる技術ってそうないんじゃないか
>>875 あの正規表現は間違ってる。
AB0000 => 0
のせいで正しい正規表現自体が存在しなかったけど。
>>876 これでどうだ?
Regex.Replace(input,"(?<![0-9])0+(?=[0-9])","")
>>876 ふらっといけよ、お前みたいな初心者が来るとネタですらないどうでもいい内容のレスが増えて迷惑
>>879 ほんと、どうでもよくて意味がないよな。
まるで糞仕様を発注してきて何度も確認したのに
その通りに作るとクレーム入れてくる糞カスタマーみたいだな
> それだと2バイト文字が来るとどうにも・・・orz
どうでもいいどころかこういうノイズを撒き散らして脳にダメージを与えてくるからたちが悪い
IPさらしながら書けよ雑魚
>>883 こういう糞みたいなカス煽りも出てくるしな
885 :
883:2011/11/30(水) 21:01:26.87
だからお前みたいな基地外はこて半つけるか
IPさらせって
ばればれの自演してんじゃねーよボケ
それで?
この板をIDなしにしたやつは賢明だよな
889 :
876:2011/11/30(水) 21:06:37.16
すいませんでした。ここで質問したのは場違いだったみたいです。
スレが荒れる原因になってごめんなさい。
初心者スレのほうに移ります。
ほら、お前らが苛めるから泣いちゃったじゃねーか
Twitterか海外に行こうぜ
ID在ったほうがいいと思うんだけどなぁ
LINQ厨が大反対するだろうな。
ふらっとはさらっと
ここはどろっとしている。
Twitter氏と海外フォーラム殿と例外と100倍が荒れ狂うんじゃねえの
896 :
デフォルトの名無しさん:2011/11/30(水) 22:52:59.38
>>895 ←このスレの主? 書き込んでる単語の意味が全然分からないんだけど・・・。いつもここで荒らしてるしひと?
そいつキチガイだから触れちゃダメ。
主って何だよどこかの厨房ですか
「ぬし」だろ
「しゅ」と読んだお前こそ
今日スカンク頭のジジイに「アルジを呼べ!」ってゆあれた
Twitterと海外がいたのはふらっとスレとWPFスレだぞ
ここには来てない
System.Linq.Expressionでthisを参照する方法はありますか?
書きたいExpressionをラムダ式で表現してみてくれ
Λ人入λ
ダーリン、浮気は許さないっちゃ
907 :
デフォルトの名無しさん:2011/12/01(木) 08:58:12.72
一人、なんでもあだ名つけて通ぶってる馬鹿ってなんなの?
そいつキチガイだから触れちゃダメ。
そうだ俺に触るな、欝は伝染するぞ
駄目って言われてもやるのが馬鹿の馬鹿たる所以
911 :
デフォルトの名無しさん:2011/12/01(木) 23:15:02.61
IPさらせって言ってんだろバカ
研修1ヶ月、実務に入って3ヵ月になる新人です。
入門書的なテキストじゃ少し物足りないってレベルなのですが
オススメの参考書とかあったら教えてください。
>>912 プログラミング.NET Framework第3版
お断りします。
『.NETのクラスライブラリ設計 』の糞訳の人じゃん。
C言語のK&Rだって糞訳だけど、買わなきゃいけない本なんだよ!
本当の糞訳ってのはプログラミング言語C++第三版だろ。
ここで誰も「原本を買え」っていう奴がいなくて安心した
原本??
922 :
デフォルトの名無しさん:2011/12/02(金) 11:27:02.50
機械翻訳とコピペだけで内容を確認せず仕上げる糞訳者は晒さないとな。
いつもコピーしている奴は原本なんて言っちゃうんだろうなw
>>919 それ買ってあまりの糞訳に絶望して本屋に返品しに行ったわ
すっげええ嫌な顔されたけどあれはもはや日本語じゃなかった
原著だろ。
翻訳前の本を原本というみたいだけど
普通は複写に対してオリジナルを原本,翻訳される本を原著というのが一般的かと思う。
Richter本はなんで訳者を駄目な人に変えちゃったんだろうな...
MS Pressは良書ほど糞訳が付きやすいような気がする
豊田孝とか読んでてイライラしますねん
>>928 前の人はもう.NETとは関わってないみたいだからしょうがないのかもねえ
930 :
デフォルトの名無しさん:2011/12/03(土) 13:14:33.19
コンボボックスに選択肢にないものを文字入力した場合、SelectedItemの値がnullになるんですけど、どうしたら自分で入力していた値を取得できますか?
.Text
選択されてないんだからnullじゃないと
まぁ、ワシのティンコはヌルヌルですけどね
そんなことどでもいいがな゚.+:。(ノ^∇^)ノ゚.+:。
934 :
デフォルトの名無しさん:2011/12/03(土) 13:31:12.93
935 :
デフォルトの名無しさん:2011/12/03(土) 13:33:22.93
ありがとうございました。
SelectedItemとは何だったのか
.Textだけだと、選択肢から選んだのか手で打ったのかわかんねーじゃん。
.NEXT
言語仕様に、フィールドのローカル変数への代入は最適化で消えないと明記すればいいのにな
完全に公然の了解になっていて、今さら852程度の小細工でどうなるもんでもない
もしかして見落としてるだけ?
941 :
デフォルトの名無しさん:2011/12/05(月) 10:14:58.23
942 :
デフォルトの名無しさん:2011/12/07(水) 21:33:32.56
カスタムコントロール内の独自のクラス型のプロパティに関する質問です。
C#でカスタムコントロールを作っています。
自分で定義したクラス型のプロパティを作成し、
そのクラス用の TypeConverter を作成して
そのクラス型に TypeConverter 属性を指定もしました。
こんなイメージです
[TypeConverter(typeof(AConverter))]
class A { ... }
class AConverter : ExpandableObjectConverter { ... }
class BControl
{
これでデザイナで独自クラス型でもプロパティ
943 :
デフォルトの名無しさん:2011/12/07(水) 21:37:29.11
途中で送信してしまいました・・・。
カスタムコントロール内の独自のクラス型のプロパティに関する質問です。
C#でカスタムコントロールを作っています。
自分で定義したクラス型のプロパティを作成し、
そのクラス用の TypeConverter を作成して
そのクラス型に TypeConverter 属性を指定もしました。
こんなイメージです
[TypeConverter(typeof(AConverter))] class A { ... }
class AConverter : ExpandableObjectConverter { ... }
class BControl : UserControl { A Hoge { get; set; } ... }
これでデザイナで Hoge プロパティに値が表示され、
一見その値も変更できるようにも見えるのですが、
変更が *.Designer.cs には反映されず、
デザイナを閉じてもう一度開くと初期値が表示されてしまいます。
値の変更が永続的に反映されるようにするにはどのようにすれば良いのでしょうか?
環境は VS2008 SP1 です。
聞きたいことを先ず最初に書かないとだめよ?
だらだら読ませて、興味を無くした人に、最後に質問ですって
そら、答える人は奇特な人しか居らんわ。
うるせー馬鹿
>>943 Hogeプロパティに[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]を付ける
947 :
デフォルトの名無しさん:2011/12/07(水) 22:33:25.27
>>946 できました!
これで胃の痛みからも解消されます
ありがとうございました
もう少しで危篤な人になるところだったのか・・・
どんだけ苦しんでるんだよ・・・。
と思ったら、setter のあるプロパティしか反映されないー
AConverter を使ってくれないのですね・・・
A の中の setter のあるプロパティしか反映されない・・・ということです
Hoge にはもちろん setter はあります
int型の計算でi = i + 1というのはC#だとどう書けばいいですか?
953 :
デフォルトの名無しさん:2011/12/07(水) 23:14:28.71
i++;
++i;
i+=1;
ありがとん
構造体の中のstring配列に文字列を代入したいのですが
構造体の宣言部に数を定義していないのですが string names[] ←こんな感じ
この中に代入するにはどうすれば良いですか?
最大値の分からない繰り返しの中で
hogehoge.names[i] = "hoge"のように代入したいです
956 :
デフォルトの名無しさん:2011/12/07(水) 23:35:48.09
>>955 配列じゃなくList<T>じゃダメなの?
それ初めて見ました
ちょっと調べてみます。ありがとう
958 :
943,947,950-951:2011/12/07(水) 23:57:46.11
AにSerializable属性を付けて
AConverterにInstanceDescriptorへのCanConvertTo, ConvertToを実装する事で
何とかデザイナでの変更を永続的に反映させる事ができるようになりました
ただ、このBControlを含むプロジェクトをビルドすると、
Hoge プロパティの値を変更しようとしても
「プロパティ 'Hoge' のコード生成に失敗しました。エラー: 'AConverter' は '***.A' から
System.ComponentModel.Design.Serialization.InstanceDescriptor' に変換できません」
というエラーが出てしまいます。
VSを再起動すればその後1回だけは出なくなりますが、
次からまたエラーが出るようになります。
AConverterの名前を変更するとVSを再起動するまでは出なくなるようですが、
VSを再起動するとまた2度目からエラーが出るようになります。
どうにかならないものでしょうか・・・。
959 :
958:2011/12/08(木) 00:54:33.91
ダンプコードを入れてみると、
やはりビルドしてもAやAConverterが昔のままのようですね
新しくできたアセンブリと齟齬を起こして
(新しい)Aから(昔の)Aへのキャストに失敗してエラーになるようです
BControlは新しくなるのになんでこんな中途半端な実装なんだろう・・・
>>958 なんか名前がすごいことになったなw
つか、なんでこのスレってID表示されないん? いっつもすげー不便だと思うんだけど。
過疎スレなんだからID生成程度のリソースをけちらないでくれ
961 :
959:2011/12/08(木) 01:42:04.39
ConvertToの第3引数(変換元のAの値)を
無理矢理Aにキャストするとエラーが詳しく出てくるようになりました
やはり使用するアセンブリが異なるようです
アセンブリのフルパスが表示されていましたが、
...\ProjectAssembly\????????\********.exe の ? の部分が異なっていました。
(? はテンポラリディレクトリ名っぽいランダムな名前)
プロパティの値を入力する分には問題がないようですが、
いざ保存するとなるとこのエラーになるようです。
プロパティの値を入力する時のアセンブリは新しいアセンブリが使われますが、
保存するときは古いアセンブリが使われてしまうようです。(なんじゃそりゃ)
悔しいので、型チェックは Type の比較でなく FullName の比較にして、
ConvertToの第3引数からリフレクションを使ってInstanceDescriptorを作ってやる事で
なんとかする事はできました。
ただ、Aのコンストラクタが変化した場合には、AConverterのコードを変更した後、
やはりVSを再起動する必要があるようです。
まあ苦肉の策には違いないので、古いアセンブリを見なくする方法があれば
引き続きお教えいただければと思います。