質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

2回答

2999閲覧

コードの記述 もっと綺麗に書くには

ranran

総合スコア85

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2015/03/28 07:17

編集2015/03/28 08:26

お世話になります。

先日以下の用件を満たすメソッドを作成しました。
datarowのリストを受け取り連続する値を削除し戻すものです。

lang

1Public Function toNotContList(ByVal rows As List(Of DataRow)) As List(Of DataRow) 2 3 '2回以上連続しているrowは1つとみなす 4 Dim lcnt As Integer = 0 '連続数 5 Dim lrow As DataRow = Nothing '連続行 6 Dim ansRow As New List(Of DataRow) 7 For i As Integer = 0 To rows.Count - 1 8 9 '不正インデックスにアクセスする前に、ansRow追加、ループを抜ける() 10 If i = rows.Count - 1 Then GoTo AddRow 11 12 If rows(i).Item("F_Tmp") = rows(i + 1).Item("F_Tmp") Then 13 '連続した場合 連続情報保存 14 lcnt += 1 15 lrow = rows(i) 16 Else 17 18AddRow: 19 '連続しなくなった場合 ansRowに追加 20 If lcnt = 0 Then 21 '連続情報 連続無し 22 ansRow.Add(rows(i)) 23 Else 24 '連続情報 連続あり 25 ansRow.Add(lrow) 26 lcnt = 0 27 End If 28 29 '最後の比較が終了した場合終了 30 If i = rows.Count - 1 Then Exit For 31 32 End If 33 Next 34 Return ansRow 35 End Function

他に記述の仕方はあるでしょうか?
またはこのメソッドでできるよ!
等ありましたらご教授ください。

追記1:
ループの仕方が汚く思いましたので、
連続チェックの回数分でForをまわすよう修正しました。

lang

1Public Function toNotContList(ByVal rows As List(Of DataRow)) As List(Of DataRow) 2 3 '2回以上連続しているrowは1つとみなす 4 Dim lcnt As Integer = 0 '連続数 5 Dim lrow As DataRow = Nothing '連続行 6 Dim ansRow As New List(Of DataRow) '結果 7 8 For i As Integer = 0 To rows.Count - 2 9 '連続チェック回数分ループ 10 11 If rows(i).Item("F_Tmp") = rows(i + 1).Item("F_Tmp") Then 12 '連続した場合 連続情報保存 13 lcnt += 1 14 lrow = rows(i) 15 16 '最後の連続チャックの場合、ansRow追加 17 If i = rows.Count - 2 Then GoTo AddRow 18 19 Else 20Addrow: 21 '連続しなくなった場合 ansRowに追加 22 If lcnt = 0 Then 23 '連続情報 連続無し 24 ansRow.Add(rows(i)) 25 Else 26 '連続情報 連続あり 27 ansRow.Add(lrow) 28 lcnt = 0 29 End If 30 31 End If 32 Next 33 Return ansRow 34 End Function

改善点としては、
1、引数でカラム名を受け取るようにする
2、gotoを使わないようにする
3、拡張メソッドとする
でしょうか?

追記2
コード挙げておいてなんですが、
思惑通り動いてないようです(^^;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Public Function toNotContList(ByVal rows As List(Of DataRow)) As List(Of DataRow)

Dim resultRow As New List(Of DataRow) Dim tmpValue As String = "" For Each DataRow dr In rows If Not tmpValue.equls(dr.Item("F_Tmp")) Then Dim tmpDataRow As New DataRow tmpDataRow.Item("F_Tmp") = dr.Item("F_Tmp") resultRow.Add(tmpDataRow) tmpValue = dr.Item("F_Tmp") End If Next Return ansRow

End Function

こんなんはどうでしょう。
DataRowのF_Tmpにどんな値が入ってくるかわかりませんが、
空文字があるならば、tmpValueの初期値をNullにして、
比較する前にNullチェックを追加すればいいかと思います。
また、DataRowのF_Tmpに入ってる値が値型か参照型かで
使う際に気をつけたほうがいいと思います。
最後にStringの比較は"="でなく、専用メソッドがあったと
思います。equlsはjavaだったような気がしますので、
間違ってたらすみません。

投稿2015/03/28 23:56

編集2015/03/28 23:58
ManabuHayashi

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ranran

2015/03/29 09:42

回答ありがとうございます! シンプルに考えることが重要ですね 毎回先輩方にお前は難しく考えすぎだといわれます(^^; おっしゃるとおり比較の専用メソッドあります! 折角あるのだから使うべきですね ありがとうございました、参考になりました♪
guest

0

ベストアンサー

VBじゃないし範囲チェックが抜けたり雑なコードですが・・・意味が伝わりますか?
int i= 0;
int j= 0;
while(i < cnt){
tmp= a[i++];
while(a[i]==tmp){
i++;
}
b[j++]= tmp;
}

投稿2015/03/28 11:18

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ranran

2015/03/28 12:15

回答ありがとうござます! すばらしいです 何で自分は無駄な処理をして余計複雑にしていたのかと...orz 連続していない値を取得する これをそのまま体現したコードでした! ありがとうございました!
cateye

2015/03/28 13:46

ごめん・・・iが進んでない tmp= a[i++]; × tmp= a[i]; ○ while(a[i++]==tmp) ; にしてくださいmm
ranran

2015/03/28 14:31

ご丁寧にありがとうございます! たとえ雑といわれるコードであっても 回答いただけたことにこそ価値があります。 cateyeさんのおかげで また1つ賢くなれました。 今後とも積極的に回答いただけたらと思います(^^)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問