毎日風邪気味、okitaです。
今回はGeneXusの記事にするかNode.jsの記事にするか悩みました!
マイブーム Node.js!!!!!
ということでGeneXusの記事を書きますw
今回は簡単なところで配列およびSDT内の存在確認とかを備忘録として
残しておきまーす。
使用した環境は以下
GeneXus X Ev2 u7
C# IIS .Net
目次
■INを使用した存在確認 – 文字列変数
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27  | 
						Event Enter 	// 配列を作成 	&VarCharCollection.Clear() 	&VarCharCollection.Add("Test1") 	&VarCharCollection.Add("Test2") 	&VarCharCollection.Add("Test3") 	&VarCharCollection.Add("Test4") 	&VarCharCollection.Add("Test5") 	// IN を使用し存在を確認1 	&SearchVarChar = !"Test1" 	If &SearchVarChar in &VarCharCollection 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif 	// IN を使用し存在を確認2 	&SearchVarChar = !"Test9" 	If &SearchVarChar in &VarCharCollection 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif Endevent  | 
					
■IndexOfを使用した存在確認 – 文字列変数
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27  | 
						Event Enter 	// 配列を作成 	&VarCharCollection.Clear() 	&VarCharCollection.Add("Test1") 	&VarCharCollection.Add("Test2") 	&VarCharCollection.Add("Test3") 	&VarCharCollection.Add("Test4") 	&VarCharCollection.Add("Test5") 	// IndexOf を使用し存在を確認1 	&SearchVarChar = !"Test1" 	If &VarCharCollection.IndexOf(&SearchVarChar) > 0 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif 	// IndexOf を使用し存在を確認2 	&SearchVarChar = !"Test9" 	If &VarCharCollection.IndexOf(&SearchVarChar) > 0 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif Endevent  | 
					
★☆★☆ 結果 ★☆★☆

★☆★☆ 解説 ★☆★☆
存在確認する方法として「IN」と「IndexOf」を使用しました。
どちらで実装しても結果は同じになりますね。
次はSDT内の検索
SDTは以下のような形・・・・まぁ適当です!

■INを使用した存在確認 – SDT変数
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43  | 
						Event Enter 	// 配列を作成 	&SDT_KeyValueCollection.Clear() 	For &i = 1 to 10 		&SDT_KeyValue = new() 		&SDT_KeyValue.Key = &i 		&SDT_KeyValue.Value = !"Test_" + &i.ToFormattedString() 		&SDT_KeyValueCollection.Add(&SDT_KeyValue) 	Endfor 	// IN を使用し存在を確認1 	&SDT_KeyValue = &SDT_KeyValueCollection.Item(1) 	If &SDT_KeyValue in &SDT_KeyValueCollection 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif 	// IN を使用し存在を確認2 	&SDT_KeyValue = &SDT_KeyValueCollection.Item(99)	// 危険! 	If &SDT_KeyValue in &SDT_KeyValueCollection 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif 	// IN を使用し存在を確認3 	&i = 1 	&SDT_KeyValue = new() 	&SDT_KeyValue.Key = &i 	&SDT_KeyValue.Value = !"Test_" + &i.ToFormattedString() 	If &SDT_KeyValue in &SDT_KeyValueCollection 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif Endevent  | 
					
■IndexOfを使用した存在確認 – SDT変数
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43  | 
						Event Enter 	// 配列を作成 	&SDT_KeyValueCollection.Clear() 	For &i = 1 to 10 		&SDT_KeyValue = new() 		&SDT_KeyValue.Key = &i 		&SDT_KeyValue.Value = !"Test_" + &i.ToFormattedString() 		&SDT_KeyValueCollection.Add(&SDT_KeyValue) 	Endfor 	// IN を使用し存在を確認1 	&SDT_KeyValue = &SDT_KeyValueCollection.Item(1) 	If &SDT_KeyValueCollection.IndexOf(&SDT_KeyValue) > 0 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif 	// IN を使用し存在を確認2 	&SDT_KeyValue = &SDT_KeyValueCollection.Item(99)	// 危険! 	If &SDT_KeyValueCollection.IndexOf(&SDT_KeyValue) > 0 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif 	// IN を使用し存在を確認3 	&i = 1 	&SDT_KeyValue = new() 	&SDT_KeyValue.Key = &i 	&SDT_KeyValue.Value = !"Test_" + &i.ToFormattedString() 	If &SDT_KeyValueCollection.IndexOf(&SDT_KeyValue) > 0 		MSG(!"存在します") 	Else 		MSG(!"存在しません") 	Endif Endevent  | 
					
★☆★☆ 結果 ★☆★☆

★☆★☆ 解説 ★☆★☆
・IN を使用し存在を確認1
コレクションからインデックスが1のアイテムを取得してからIN、IndexOfで
存在を確認しているので当然「存在します」がメッセージとして出てきます。
・IN を使用し存在を確認2
インデックスが99のアイテムを取得してIN、IndexOfで存在確認なので
「存在しません」がメッセージとして出力されます。
危険!と書いたのはインデックスの存在確認(カウントとかIndexOfとか)を
使用しないでいきなりインデックス99のアイテムにアクセスしているからです。
・IN を使用し存在を確認3
これは「存在しません」が出力されます。
アイテムの内容が同じようになるのだから「存在します」が出るような気がしますが
newを行っているので別物という認識なのでしょう・・・たぶんw
備忘録として書きましたがなんか久々に書きました。
GeneXusやればやるだけ謎が増えるwww
公式wikiのリンクも張っておきますよっと。
GeneXus wiki – IN演算子
http://wiki.genexus.jp/hwiki.aspx?IN+%E6%BC%94%E7%AE%97%E5%AD%90,
GeneXus wiki – IndexOf
http://wiki.genexus.jp/hwiki.aspx?IndexOf+%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89,
余談
一番最初に数値で適当にサンプル作ってブログ書くかぁって思ってやったのが
以下のコード・・・・GeneXusさすがっすw
■IndexOfを使用した存在確認 – 数値変数
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30  | 
						Event Enter 	// 配列を作成 	For &i = 1 to 10 		&NumericCollection.Add(&i) 	Endfor 	// 検索する数値を設定 	&SearchValue = 3 	// 数値配列を検索	 	If &NumericCollection.IndexOf(&SearchValue) > 0 		MSG(!"配列内に存在します") 	Else 		MSG(!"配列内に存在しません") 	Endif 	// Jsonで新しいコレクションに移動 	&NumericCollection2.FromJson(&NumericCollection.ToJson()) 	// 数値配列を検索	 	If &NumericCollection2.IndexOf(&SearchValue) > 0 		MSG(!"配列内に存在します") 	Else 		MSG(!"配列内に存在しません") 	Endif Endevent  | 
					
★☆★☆ 結果 ★☆★☆

★☆★☆ 解説 ★☆★☆
バグかな?(゚⊿゚)シラネw