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

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

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

Re[6]: IComparer使用時に値を取得する方法について


(過去ログ 13 を表示中)

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

■3892 / inTopicNo.1)  IComparer使用時に値を取得する方法について
  
□投稿者/ うっちー (4回)-(2007/05/28(Mon) 11:32:21)

分類:[.NET 全般] 

VS Version:Visual Studio 2003
OS Windows XP

データを、ArrayList作成時にIComparerインターフェイスを使って並べ替えをする処理を作成しました。
その後、ArrayListに格納されている、あるインデックス値の値を取得したいのですが、
IComparerを使用した場合は、For等でインデックス値を進めて値を取得するしか方法はないのでしょうか?
itemとインデックス値を直接指定して取得は出来ないのでしょうか?
試しに、下記のように指定してみましたが

AAA = CType(al_TEST.Item(2), String).ToString の処理にて

'System.InvalidCastException' のハンドルされていない例外が microsoft.visualbasic.dll で発生しました。
追加情報 : 型 'SortClass' から型 'String' へのキャストが有効ではありません。

とエラーが表示されてしまいました。
あつかましいとは、参考になるサイト等を紹介して頂きたいのですが皆様宜しくお願いします。

以下ソースです。
Option Strict On
Option Explicit On

Module Module1
Sub Main()
Dim sc As SortClass
Dim mc As New MyComparer
Dim count As Integer
Dim al_TEST As New ArrayList

al_TEST.Add(New SortClass("項目A", "項目お", "項目2"))
al_TEST.Add(New SortClass("項目B", "項目う", "項目4"))
al_TEST.Add(New SortClass("項目C", "項目あ", "項目5"))
al_TEST.Add(New SortClass("項目D", "項目い", "項目3"))
al_TEST.Add(New SortClass("項目E", "項目え", "項目1"))

mc.Key = MyComparer.SortKey.OSUUJI
al_TEST.Sort(mc)

For Each sc In al_TEST
If count = 2 Then
Console.WriteLine(sc.OEIJI & " , " & sc.OHIRAGANA & " , " & sc.OSUUJI)
Exit For
End If
count += 1
Next

Dim AAA As String
AAA = CType(al_TEST.Item(2), String).ToString

End Sub

Public Class SortClass
Public OEIJI As String
Public OHIRAGANA As String
Public OSUUJI As String

Public Sub New(ByVal scEIJI As String, ByVal scHIRAGANA As String, ByVal scSUUJI As String)
OEIJI = scEIJI
OHIRAGANA = scHIRAGANA
OSUUJI = scSUUJI
End Sub
End Class

Public Class MyComparer
Implements System.Collections.IComparer

Public Key As SortKey
Public Enum SortKey
OEIJI
OHIRAGANA
OSUUJI
End Enum

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare

Dim result As Integer
Dim cx As SortClass = CType(x, SortClass)
Dim cy As SortClass = CType(y, SortClass)

Select Case Key
Case SortKey.OEIJI
result = String.Compare(cx.OEIJI, cy.OEIJI)
Case SortKey.OHIRAGANA
result = String.Compare(cx.OHIRAGANA, cy.OHIRAGANA)
Case SortKey.OSUUJI
result = String.Compare(cx.OSUUJI, cy.OSUUJI)
End Select

Return result

End Function
End Class
End Module

引用返信 編集キー/
■3896 / inTopicNo.2)  Re[1]: IComparer使用時に値を取得する方法について
□投稿者/ J.Hashimoto (5回)-(2007/05/28(Mon) 12:23:59)
No3892 (うっちー さん) に返信
> IComparerを使用した場合は、For等でインデックス値を進めて値を取得するしか方法はないのでしょうか?
いえ、そんなことはないです。

> AAA = CType(al_TEST.Item(2), String).ToString の処理にて
ここの記述が誤っているので例外が発生していますが、正しく記述すればIndexで参照できますよ。

まずはMSDNで例外の原因を調べてみてください。
CType 関数
http://msdn2.microsoft.com/ja-jp/library/4x2877xb(VS.80).aspx

引用返信 編集キー/
■3900 / inTopicNo.3)  Re[2]: IComparer使用時に値を取得する方法について
□投稿者/ うっちー (5回)-(2007/05/28(Mon) 15:04:57)
J.Hashimoto さん返信ありがとうございます。

No3896 (J.Hashimoto さん) に返信
> まずはMSDNで例外の原因を調べてみてください。
> CType 関数
> http://msdn2.microsoft.com/ja-jp/library/4x2877xb(VS.80).aspx

早速、修正してみました。
Dim AAA As Object
AAA = CType(al_TEST.Item(2), Object)

修正後、実行したらインデックス3番目の3つの項目(OEIJI,OHIRAGANA,OSUUJI)を取得できました。

さらに、あつかましい質問なのですが、インデックス3番目のOSUUJI項目だけを取得する方法も、
CTypeを使用すれば宜しいのでしょうか?
申し訳ありません、理解するのに時間が掛かるものですから。

引用返信 編集キー/
■3908 / inTopicNo.4)  Re[3]: IComparer使用時に値を取得する方法について
□投稿者/ よねKEN (40回)-(2007/05/28(Mon) 16:07:06)
よねKEN さんの Web サイト
> ■No3896 (J.Hashimoto さん) に返信
>>まずはMSDNで例外の原因を調べてみてください。
>>CType 関数
>>http://msdn2.microsoft.com/ja-jp/library/4x2877xb(VS.80).aspx
>
> 早速、修正してみました。
> Dim AAA As Object
> AAA = CType(al_TEST.Item(2), Object)

al_TEST.Item(2)が返す値の型はObject型ですので、
ObjectからObjectに型変換するのでは意味がありませんよ。
(Option Strict Onを指定されることをお勧めします。
詳細はヘルプで調べてみてください)

その前のal_TEST.Addメソッド呼び出しでSortClassのインスタンスを
追加しているのですから、SortClassに型変換するべきでしょう。

> 修正後、実行したらインデックス3番目の3つの項目(OEIJI,OHIRAGANA,OSUUJI)を取得できました。
>
> さらに、あつかましい質問なのですが、インデックス3番目のOSUUJI項目だけを取得する方法も、
> CTypeを使用すれば宜しいのでしょうか?

SortClassのフィールドのOSUUJIを取得するためには、
まずObjectからSortClassに型変換する必要がありますよね。

> 申し訳ありません、理解するのに時間が掛かるものですから。

この辺を理解するには、クラスとは何か?インスタンスとは何か?を
正しく理解しておく必要があります。
オブジェクト指向について学べそうなVB.netの入門書などで勉強されることをお勧めします。

引用返信 編集キー/
■3910 / inTopicNo.5)  Re[4]: IComparer使用時に値を取得する方法について
□投稿者/ うっちー (6回)-(2007/05/28(Mon) 16:35:07)
よねKEN さんご指摘ありがとうございます。

No3908 (よねKEN さん) に返信
> al_TEST.Item(2)が返す値の型はObject型ですので、
> ObjectからObjectに型変換するのでは意味がありませんよ。

Dim AAA As SortClass
Dim BBB As String
AAA = CType(al_TEST.Item(2), SortClass)
BBB = CType(AAA.OSUUJI, String)

上記のとおり修正しましたら、正常に取得が出来ました。


> (Option Strict Onを指定されることをお勧めします。
> 詳細はヘルプで調べてみてください)
>

Option Strict On は常に指定していますよ、私のソースの一番上に記述があります。
でも、ご指摘ありがとうございます。


>>申し訳ありません、理解するのに時間が掛かるものですから。
>
> この辺を理解するには、クラスとは何か?インスタンスとは何か?を
> 正しく理解しておく必要があります。
> オブジェクト指向について学べそうなVB.netの入門書などで勉強されることをお勧めします。

ご指摘のどおり入門書等で勉強し直します。


J.Hashimoto さん、よねKEN さんご指摘ありがとうございました。
また、解らない事が出来ましたら利用させて頂きますのでその時はまた、ご助力して下さいますようお願いします。

解決済み
引用返信 編集キー/
■3911 / inTopicNo.6)  Re[5]: IComparer使用時に値を取得する方法について
□投稿者/ よねKEN (41回)-(2007/05/28(Mon) 16:45:23)
よねKEN さんの Web サイト
#投稿しようとしたら、なぜかスパムコメントとみなされましたorz

> Dim AAA As SortClass
> Dim BBB As String
> AAA = CType(al_TEST.Item(2), SortClass)
> BBB = CType(AAA.OSUUJI, String)
>
> 上記のとおり修正しましたら、正常に取得が出来ました。

BBB = CType(AAA.OSUUJI, String)
での型変換は不要で、
BBB = AAA.OSUUJI
でよいでしょう。
AAA.OSUUJIはSortClassでの定義(Public OSUUJI As String)によればString型ですから。

>>(Option Strict Onを指定されることをお勧めします。
>> 詳細はヘルプで調べてみてください)
>>
>
> Option Strict On は常に指定していますよ、私のソースの一番上に記述があります。
> でも、ご指摘ありがとうございます。

前回のうっちーさんの投稿で
> Dim AAA As Object
> AAA = CType(al_TEST.Item(2), Object)
>
> 修正後、実行したらインデックス3番目の3つの項目(OEIJI,OHIRAGANA,OSUUJI)を取得できました。

以上のように記載がありました。
AAAはObject型ですので、このAAAからAAA.OSUUJIのように
フィールドの値を取得することは、型を厳密に扱うOption Strict Onではできません。
ですので、Option Strict Onにした方がよいという指摘をしました。
その点からOption Strict Offなのだと判断したのですが、
何かが違ったようですね。

解決済み
引用返信 編集キー/
■3932 / inTopicNo.7)  Re[6]: IComparer使用時に値を取得する方法について
□投稿者/ うっちー (7回)-(2007/05/29(Tue) 10:49:55)
よねKEN さん、ご指摘ありがとうございます。

> BBB = CType(AAA.OSUUJI, String)
> での型変換は不要で、
> BBB = AAA.OSUUJI
> でよいでしょう。
> AAA.OSUUJIはSortClassでの定義(Public OSUUJI As String)によればString型ですから。

無駄な変換だったのですね、ご指摘ありがとうございます。


>>>(Option Strict Onを指定されることをお勧めします。
>>> 詳細はヘルプで調べてみてください)
>>>
>>
>>Option Strict On は常に指定していますよ、私のソースの一番上に記述があります。
>>でも、ご指摘ありがとうございます。
>
> 前回のうっちーさんの投稿で
>>Dim AAA As Object
>>AAA = CType(al_TEST.Item(2), Object)
>>
>>修正後、実行したらインデックス3番目の3つの項目(OEIJI,OHIRAGANA,OSUUJI)を取得できました。
>
> 以上のように記載がありました。
> AAAはObject型ですので、このAAAからAAA.OSUUJIのように
> フィールドの値を取得することは、型を厳密に扱うOption Strict Onではできません。
> ですので、Option Strict Onにした方がよいという指摘をしました。
> その点からOption Strict Offなのだと判断したのですが、
> 何かが違ったようですね。

申し訳ありませんでした、私の説明不足でした。
>Dim AAA As Object
>AAA = CType(al_TEST.Item(2), Object)
を指定し、デバッグ実行で確認していたら、AAAの値にscと同じ内容が取得出来ていたので
つい「取得できました。」と書き込んでしまいました。この時点では、
>BBB = CType(AAA.OSUUJI, String)
の指定は、ご指摘のように扱うことが出来ていませんでした。

私の説明不足で、ご不快な思いをさせていたら申し訳ありませんでした。
次回からは、正確な情報を書き込みたいと思います。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -