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

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

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

Re[6]: 初歩的な質問ですみません。


(過去ログ 139 を表示中)

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

■81840 / inTopicNo.1)  初歩的な質問ですみません。
  
□投稿者/ 夜叉丸 (16回)-(2016/11/17(Thu) 09:21:32)

分類:[.NET 全般] 

2016/11/17(Thu) 09:25:12 編集(投稿者)

以下のようなループの入れ子になっているプログラムを作るとき
判別フラグを作ってやはり判断するのが普通なのでしょうか?
このような場合皆さんはどのようにコードを書くのでしょうか?
初歩的な質問でごめんなさい。
------------------------------
for ()
{
bool bl = false;
for ()
{
 if ()
{
bl = true;
break;
}
else if()
{
bl = true;
break;
}
}
if(bl == true) break;
}

if(bl == true)
{
}
------------------------------
関数にして
bl = true;
break;

return(true);
という方法も考えたのですが、
ここでしか使わないコードを関数にする意味もないかなと思います。
あと、try 〜 catch を使うのも考えたのですが例外処理を
正当処理として扱うのも変なのかなと
------------------------------
try {
・・・・
if()
{
throw new Exception("OK");
}
・・・・
}
catch(Exception ex)
{
if(ex.Message == "OK")
{
}
}
------------------------------
フォートランだと余計なフラグを使わずに
goto OK, goto NG で処理できるんですけど
引用返信 編集キー/
■81842 / inTopicNo.2)  Re[1]: 初歩的な質問ですみません。
□投稿者/ とっちゃん (407回)-(2016/11/17(Thu) 10:58:59)
No81840 (夜叉丸 さん) に返信

> フォートランだと余計なフラグを使わずに
> goto OK, goto NG で処理できるんですけど

C# にも goto 文がありますよ?

for ()
{
  bool bl = false;
  for ()
  {
    if ()
    {
      bl = true;
      goto loopout;
    }
    else if() 
    {
      bl = true;
      goto loopout;
    }
  }
}
loopout:
if(bl == true)
{
}
こんな感じ。

引用返信 編集キー/
■81844 / inTopicNo.3)  Re[1]: 初歩的な質問ですみません。
□投稿者/ WebSurfer (1071回)-(2016/11/17(Thu) 11:47:25)
No81840 (夜叉丸 さん) に返信

> あと、try 〜 catch を使うのも考えたのですが例外処理を
> 正当処理として扱うのも変なのかなと

余計なお世話かもしれませんが・・・

例外処置については以下の記事が参考になると思いますので、一度目を通すことをお
勧めします。

try - catch をこのような目的に使っていいのか、Exception をキャッチしていいの
か・・・ということが分かると思います。

NETの例外処理 Part.1
https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/

.NETの例外処理 Part.2
https://blogs.msdn.microsoft.com/nakama/2009/01/02/net-part-2/

.NET 4 からは破損状態例外は catch できなくなっているそうですが、「それでも
catch (Exception e) を使用するのはよくない」ということについては以下の記事
を見てください。

破損状態例外を処理する
https://msdn.microsoft.com/ja-jp/magazine/dd419661.aspx
引用返信 編集キー/
■81845 / inTopicNo.4)  Re[1]: 初歩的な質問ですみません。
□投稿者/ 魔界の仮面弁士 (953回)-(2016/11/17(Thu) 13:57:23)
No81840 (夜叉丸 さん) に返信
> 以下のようなループの入れ子になっているプログラムを作るとき

提示頂いたコードにはバグがあるような気が…。


> for ()
> {
>  bool bl = false;
>  for ()
>  {
(中略)
>  }
>  if(bl == true) break;
> }
> if(bl == true)

ループ内で宣言した「bool bl = false;」は
ループ外の「if(bl == true)」の部分では使えないはずです。

上記で動作しているのだとすれば、フィールド変数などに
同名の変数が存在していて、ループ内とループ外で
異なるスコープの変数を参照していることになってしまいます。



> 判別フラグを作ってやはり判断するのが普通なのでしょうか?
何を目的とした処理なのか、意図が読み取れなかったのですが、たとえば、

bool found = false;
foreach(var calendar in calendarSet.Calendars)
{
 foreach(var schedule in calendar.Schedules)
 {
  if( schedule.ScheduleCreatedAt == targetDate )
  {
   found = true;
   break;
  }
 }
 if(found) break;
}
if(found)
{
 // データ発見!
}


のようなケースだとしたら、


var q = calendarSet.Calendars.SelectMany(c => c.Schedules);
if(q.Any(s => s.ScheduleCreatedAt == targetDate))
{
 // データ発見!
}

だけで事足りますね。
引用返信 編集キー/
■81850 / inTopicNo.5)  Re[2]: 初歩的な質問ですみません。
□投稿者/ 夜叉丸 (17回)-(2016/11/17(Thu) 15:22:21)
2016/11/17(Thu) 15:25:10 編集(投稿者)

No81845 (魔界の仮面弁士 さん) に返信

> var q = calendarSet.Calendars.SelectMany(c => c.Schedules);
> if(q.Any(s => s.ScheduleCreatedAt == targetDate))
> {
>  // データ発見!
> }
>
> だけで事足りますね。


作るのは

   string[] strdata = { "5,7-9,11", "12,16-18" };
   int num = 10;

//   ----------
   bool flg = false;
   for(int inum = 0; inum < strdata.Length; inum++)
   {
    string[] stra = strdata[inum].Split(',');
    for(int inum1 = 0; inum1 < stra.Length; inum1++)
    {
     string[] strb = stra[inum1].Split('-');
     if(strb.Length == 1)
     {
      if(int.Parse(strb[0]) == num)
      {
       flg = true;
       break;
      }
}
     else if (strb.Length == 2)
     {
      if(int.Parse(strb[0]) <= num && num <= int.Parse(strb[1]))
      {
       flg = true;
       break;
      }
     }
    }
   }
   if(flg == true)
   {
    MessageBox.Show("発見");
   }
//   ----------


> var q = calendarSet.Calendars.SelectMany(c => c.Schedules);
> if(q.Any(s => s.ScheduleCreatedAt == targetDate))
> {
>  // データ発見!
> }
みたいにできますか?
引用返信 編集キー/
■81852 / inTopicNo.6)  Re[3]: 初歩的な質問ですみません。
□投稿者/ 魔界の仮面弁士 (957回)-(2016/11/17(Thu) 16:32:46)
2016/11/17(Thu) 16:34:46 編集(投稿者)

No81850 (夜叉丸 さん) に返信
>>var q = calendarSet.Calendars.SelectMany(c => c.Schedules);
>>if(q.Any(s => s.ScheduleCreatedAt == targetDate))
>>{
>> // データ発見!
>>}
> みたいにできますか?

これで良いのかな。
strb.Length >= 3 なデータは想定していません。


var source = strdata.SelectMany(a => a.Split(',').Select(b => b.Split('-')));

bool found = source.Any(v => int.Parse(v.First()) <= num && num <= int.Parse(v.Last()));
引用返信 編集キー/
■81855 / inTopicNo.7)  Re[4]: 初歩的な質問ですみません。
□投稿者/ 夜叉丸 (18回)-(2016/11/17(Thu) 17:53:31)
2016/11/17(Thu) 18:35:26 編集(投稿者)


少し理解ができてきました。

データが、{"", "3"}だったとして
"" の場合にはすべてに合致(発見)としたいのですが
bool found = source.Any(v => v.First() == "" || (int.Parse(v.First()) <= num && num <= int.Parse(v.Last())));
これでいいんですよね


> strb.Length >= 3 なデータは想定していません。
もし、この場合にはエラーとして抽出することはできますか?


最後に dest の文字が source にすべて含まれているかどうかを調べるのに
同様の方法は使えるのでしょうか?

string[] source = new string[] { "A", "B", "C", "D" };
string[] dest = new string[] { "A", "C" };
※いずれも個数は不定
引用返信 編集キー/
■81858 / inTopicNo.8)  Re[5]: 初歩的な質問ですみません。
□投稿者/ 魔界の仮面弁士 (958回)-(2016/11/17(Thu) 19:40:06)
No81855 (夜叉丸 さん) に返信
> bool found = source.Any(v => v.First() == "" || (int.Parse(v.First()) <= num && num <= int.Parse(v.Last())));
> これでいいんですよね
要件を満たせていると思います。


>>strb.Length >= 3 なデータは想定していません。
> もし、この場合にはエラーとして抽出することはできますか?
文字列解析として、最初に正規表現でチェックするのが良いと思います。



> dest の文字が source にすべて含まれているかどうかを調べるのに
> 同様の方法は使えるのでしょうか?
> string[] source = new string[] { "A", "B", "C", "D" };
> string[] dest = new string[] { "A", "C" };
> ※いずれも個数は不定

こうかな。

return dest.All(source.Contains);



> string[] strdata = { "5,7-9,11", "12,16-18" };

strdata は 2 つの文字列を持つようですが、どちらの要素に
ヒットしたのかを区別する必要もあるのでしょうか?

提示された元のループ式を観る限り、元データは
 string[] strdata = { "5,7-9,11", "12,16-18" }; // オリジナル
 string[] strdata = { "5,7-9", "11-12,16-18" }; // 11を移動
 string[] strdata = { "5,7-9,11,12,16-18" }; // 繋げて一つに
 string[] strdata = { "5,7-9,11-12,16-18" };
 string[] strdata = { "5", "7-9", "11", "12", "16-18" }; // 全部分解
のいずれであっても、すべて同じ条件に見えるのですが。


> "" の場合にはすべてに合致(発見)としたいのですが
string[] strdata = {"", "3"};
string[] strdata = {"3", ""};

のいずれでも構わないのなら、
 found = strdata.Contains("") || source.Any(…略…);
という手もありますね。
引用返信 編集キー/
■81928 / inTopicNo.9)  Re[6]: 初歩的な質問ですみません。
□投稿者/ 夜叉丸 (20回)-(2016/11/24(Thu) 14:44:51)
No81858 (魔界の仮面弁士 さん) に返信

どうもありがとうございました。

とりあえず今回に関しては使えるようになりました。
少し応用が必要になるとLINQがなかなか動いてくれません。

とりあえず LINQ をつかえるようにしたいです。
あと、正規表現もですね。



解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -