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

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

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

複数配列から一つの項目を検索する

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

■100470 / inTopicNo.1)  複数配列から一つの項目を検索する
  
□投稿者/ ゆう (1回)-(2022/08/17(Wed) 15:03:01)

分類:[VB.NET/VB2005 以降] 

よろしくお願いします。
現在、visualstudio2019で開発を行っています。

やりたい事として、複数の配列に対して、一つの値を検索して、どの配列のどの位置にあるかを調べたいです。

適当な例が思いつかないので、例えば7月のカレンダー上の平日、土曜日、日曜+祝日をそれぞれ配列とし、値は前0埋めの2byteで値を格納しているとします。

DIM YASUMI As String() = {"03","10","17","18","24","31"}
DIM DOYOU As String() = {"02","09","16","23","30"}
DIM HEIJITU As String() = {"01","04","05","06","07","08","11","12","13","14","15","19","20","21","22","25","26","27","28","29"}


各配列に重複した値は入ってこないという前提条件があるとした中で、この「YASUMI」「DOYOU」「HEIJITU 」の中から、「10」はどの配列の何番目に入っているかを一度に検索する方法はありますでしょうか。


以下の内容でも分かるとは思いますが、分からない中での最後の手段だと思ってます。
IF Array.IndexOf(YASUMI, "10") <> -1 Then
CONSOLE.WRITELINE("HIT")
End If
IF Array.IndexOf(DOYOU , "10") <> -1 Then
CONSOLE.WRITELINE("HIT")
End If
IF Array.IndexOf(HEIJITU , "10") <> -1 Then
CONSOLE.WRITELINE("HIT")
End If

以上です。
ご教授いただければ幸いです。
引用返信 編集キー/
■100473 / inTopicNo.2)  Re[1]: 複数配列から一つの項目を検索する
□投稿者/ Hongliang (1251回)-(2022/08/17(Wed) 17:02:16)
標準ライブラリに、直接的な解決を行えるものは存在しませんね。
そういうメソッドを独自に定義するのが一番手っ取り早いのではないでしょうか。
Structure FindResult
    Public Property ArrayIndex As Integer
    Public Property IndexInArray As Integer
End Structure
Function FindArrayIndex(ByVal value As String, ParamArray arrays As String()()) As FindResult
みたいな。
で、外側の配列をFor...Nextして、内側の配列をそれぞれArray.FindIndexすると。

検索する側を単純に書きたいなら、まずデータの持ち方を考えたほうがいいでしょうね。
データ量の制約とかで仕方ないのかもしれませんけど。

> 適当な例が思いつかないので、例えば7月のカレンダー上の平日、土曜日、
> 日曜+祝日をそれぞれ配列とし、値は前0埋めの2byteで値を格納しているとします。
2byteではなくて2文字(2個のChar)です。

引用返信 編集キー/
■100475 / inTopicNo.3)  Re[1]: 複数配列から一つの項目を検索する
□投稿者/ kiku (289回)-(2022/08/17(Wed) 17:14:56)
2022/08/17(Wed) 17:49:11 編集(投稿者)
No100470 (ゆう さん) に返信
> 以下の内容でも分かるとは思いますが、分からない中での最後の手段だと思ってます。
> IF Array.IndexOf(YASUMI, "10") <> -1 Then
>    CONSOLE.WRITELINE("HIT")
> End If
> IF Array.IndexOf(DOYOU , "10") <> -1 Then
>    CONSOLE.WRITELINE("HIT")
> End If
> IF Array.IndexOf(HEIJITU , "10") <> -1 Then
>    CONSOLE.WRITELINE("HIT")
> End If

上記が一番わかりやすいと思います。

無理やり実施するのであるならば、下記のようになりますが(C#で申し訳ないです)、
コード量も増えますし、メリットがないような気がします。

            var YASUMI = new[] { "03", "10", "17", "18", "24", "31" };
            var DOYOU = new[] { "02", "09", "16", "23", "30" };
            var HEIJITU = new[] { "01", "04", "05", "06", "07", "08", "11", "12", "13", "14", "15", "19", "20", "21", "22", "25", "26", "27", "28", "29" };

            var list1 = YASUMI.Select((d, i) => new { name = "YASUMI", d, i});
            var list2 = DOYOU.Select((d, i) => new { name = "DOYOU", d, i });
            var list3 = HEIJITU.Select((d, i) => new { name = "HEIJITU", d, i });

            var list_all = list1.Concat(list2).Concat(list3);

            var hit = list_all.Where(x => x.d == "10").FirstOrDefault();

            Console.WriteLine($"配列名={hit.name}");
            Console.WriteLine($"位置={hit.i}");
            Console.WriteLine($"値={hit.d}");



引用返信 編集キー/
■100478 / inTopicNo.4)  Re[1]: 複数配列から一つの項目を検索する
□投稿者/ KOZ (312回)-(2022/08/17(Wed) 17:50:39)
No100470 (ゆう さん) に返信
> 各配列に重複した値は入ってこないという前提条件があるとした中で、この「YASUMI」「DOYOU」「HEIJITU 」の中から、「10」はどの配列の何番目に入っているかを一度に検索する方法はありますでしょうか。

一致するものが無いなら Dictionary を使うとか

Dim dic As New Dictionary(Of String, (name As String, index As Integer))
For Each item In {(Key:="YASUMI", values:=YASUMI), (Key:="DOYOU", values:=DOYOU), (Key:="HEIJITU", values:=HEIJITU)}
    For i As Integer = 0 To item.values.Length - 1
        dic.Add(item.values(i), (name:=item.Key, index:=i))
    Next
Next

Dim key As String = "10"
Dim value As (name As String, index As Integer) = Nothing
If dic.TryGetValue(key, value) Then
    Console.WriteLine($"{key} は {value.name} の {value.index + 1} 番目にあります。")
Else
    Console.WriteLine($"{key} はいずれの配列にもありませんでした。")
End If

引用返信 編集キー/
■100483 / inTopicNo.5)  Re[2]: 複数配列から一つの項目を検索する
□投稿者/ ゆう (2回)-(2022/08/18(Thu) 12:06:13)
皆様ありがとうございます。

IF Array.IndexOf(YASUMI, "10") <> -1 Then
CONSOLE.WRITELINE("HIT")
ELSE If Array.IndexOf(DOYOU , "10") <> -1 Then
CONSOLE.WRITELINE("HIT")
ELSE If Array.IndexOf(HEIJITU , "10") <> -1 Then
CONSOLE.WRITELINE("HIT")
End If

逆に手間がかかりそうなので、上記で行くとします
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ