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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

4回答

190閲覧

アルファベットを組で管理するには、どんなクラスをつくればよいでしょう?

cancat

総合スコア313

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/09/22 06:42

編集2017/09/22 07:33

こんにちは。
Windows10でC#のアプリケーションを開発しています。
Visual Studio 2017 proを使っています。

###前提・実現したいこと
F-F
G-P
Q-AS

組で管理するには、どんなクラスをつくればよいでしょう?

###該当のソースコード

C#

1TableClass 2public List<string> GroupHeaderCells = new List<string>(); 3public List<string> GroupTailCells = new List<string>();

登録

C#

1Table table = new Table(); 2table.GroupHeaderCells = new List<string>(){ "F", "G", "Q" }; 3table.GroupTailCells = new List<string>(){ "F", "P", "AS" };

よぶとき
additemにcの数だけ""を追加してます。F-Fならひとつ、G-Pなら10個です。
もともとのGroupHeaderCellsがstringなので、F-Fを数えるのに、Charにcastしてます。
単にF-F=>1回、G-P=>10回、Q-AS=>29回を取得できれば、と思います。

C#

1var additem = new List<string>(); 2for (char c = table.StartCellLocation[0].ToCharArray()[0]; c < table.GroupHeaderCells[0].ToCharArray()[0]; c++) 3 additem.Add(""); 4 5for (char c = table.GroupHeaderCells[0].ToCharArray()[0]; c < table.GroupTailCells[0].ToCharArray()[0]; c++) 6 additem.Add(""); 7 8for (char c = table.GroupHeaderCells[1].ToCharArray()[0]; c < table.GroupTailCells[1].ToCharArray()[0]; c++)

###発生している問題・エラーメッセージ
呼ぶときのコードが複雑すぎる・・・・。
ToCharArrayなくしたい。
foreachしたい。

###補足情報(言語/FW/ツール等のバージョンなど)
Microsoft Visual Studio Pro 2017
Microsoft .NET Framework
Version 4.6.01586

です。
よろしくお願いします。

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

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

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

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

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

yohhoy

2017/09/22 07:14

組で扱ってどのようなデータ操作を行いたいのでしょうか?「よぶとき」のfor文では変数cを使っていないようですが...
ozwk

2017/09/22 07:20

"よぶとき"のコードが意図も動作もよくわからないので説明お願いします
ozwk

2017/09/22 07:21

やりたいことの例だけ出されてもよくわからないので、何が与えられて何を得たいのか説明お願いします。
cancat

2017/09/22 07:26

cの数だけ""を追加してます。F-Fならひとつ、G-Pなら10個です。
ozwk

2017/09/22 07:38

GroupHeaderCells と GroupTailCells を先頭からペアにしていって、F-F =>1 G-P =>10 Q-AS =>29 として合計を出したいってことですかね? 質問文のコードだと40?
ozwk

2017/09/22 08:01 編集

A=1 ,B=2, ... , Z=26 , AA=27, ... として (XXX,YYY) => YYY - XXX +1という変換をしたいだけとみた
cancat

2017/09/22 08:01

それです! まさにそんな感じ。
guest

回答4

0

うーん、このアルファベットって要するにExcelみたいなカラム名で、指定されたカラム名の間分だけ回すってことですか? もしそうなら以下でどうですか?

というか、もう少し質問の仕方を考えたほうが良いと思います。
もし、ご自分が回答する立場だとして、質問を読み返してみて内容を理解できますか?

C#

1var GroupHeaderCells = new List<string>() { "F", "G", "Q" }; 2var GroupTailCells = new List<string>() { "F", "P", "AS" }; 3 4//---------------------------------------------- 5//HeaderとTailをZip 6//---------------------------------------------- 7var ziped = GroupHeaderCells.Zip(GroupTailCells, (v1, v2) => new { Start = v1, End = v2 }); 8 9//---------------------------------------------- 10// カラム名→番号に変換するFunc 11//---------------------------------------------- 12var ToColumNumFunc = new Func<string, int>( (col) => 13{ 14 //もっと良い方法あるかも 15 return col.ToCharArray().Select(c => c - 'A' + 1). 16 Reverse().Select((v, i) => v * (int)Math.Pow(26, i)).Sum(); 17}); 18 19//---------------------------------------------- 20// カラム名1⇔カラム名2間の長さを返すFunc 21//---------------------------------------------- 22var LengthFunc = new Func<string,string, int>((start, end) => 23{ 24 return Math.Abs( ToColumNumFunc(end) - ToColumNumFunc(start)); 25}); 26 27//---------------------------------------------- 28//Zipした要素で回す 29//---------------------------------------------- 30foreach ( var v in ziped ) 31{ 32 //開始カラム名、終了カラム名からループ回数を取得 33 int nLoop = LengthFunc(v.Start, v.End) + 1; 34 for (int i = 0; i < nLoop; i++) 35 { 36 //additem.Add(""); 37 } 38}

投稿2017/09/22 08:22

編集2017/09/22 08:25
ebiryo

総合スコア797

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

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

0

質問の意図がよく分かりません。
勝手ながら、プログラミングの初心者とお見受けします。

まずは、コンパイルが通ったコードを掲載するようにしてください。
説明が不十分でもコードで理解できるものです。
(申し訳ないけれど、このコードからやりたい事がいまいちわかりません。)

プログラムで大事なことは、入力と出力をはっきりさせることです。
この場合はクラスの中身よりも理想的なクラスの動作を定義して、それに合う動作をするコードを書くようすると比較的それらしいコードになっていきます。

でもコンパイルが通ってもたぶん、バグが混入しておもったように動作しないでしょうから、行き詰ったらその時点で質問を作成してください。(運が良ければ30分内に回答がもらえます。1日以上放置されたら質問の仕方が悪いのかもしれません。)

とりあえず動作したら、改善したい点を箇条書きにして質問しましょう。その際には前のを見ないでも回答できるようにプログラムの説明をもう一度書いて(コピペして)ください。

適切に質問する能力は適切にプログラミングする能力と直結します。それなので、丁寧に質問を作成すると質問前に答えにたどり着くことも多いはずです。(少なくとも、私はその経験は多いです。)

とりあえずこれをもって回答に替えます。

投稿2017/09/22 07:40

iwamoto_takaaki

総合スコア2883

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

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

0

よくわかんないけど、ふつうにtupleで十分じゃないかな
http://ufcpp.net/study/csharp/datatype/tuples/

投稿2017/09/22 07:09

kiichi54321

総合スコア1984

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

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

cancat

2017/09/22 07:37

おお。tupleなんかかっこよさそう。.NET4.7にして使ってみます。
guest

0

ベストアンサー

Dictionary<TKey, TValue> クラスとかはどうですか?

https://msdn.microsoft.com/ja-jp/library/xfhwa508(v=vs.110).aspx

【追記】
質問のfor文の内容はあまり理解してませんが。。。

C#

1 2Dictionary<string, string> hoge = new Dictionary<string, string>(); 3 4hoge.Add("F", "F"); 5hoge.Add("G", "P"); 6hoge.Add("Q", "AS"); 7 8foreach(var v in hoge) 9{ 10 Console.WriteLine("Key={0} : Value={1}", v.Key, v.Value); 11} 12

【追記2】

Excelのカラム数をみたいなのを知りたいのですかね?
自分は試してないですが、下のページを参考されたらどうでしょう?

Excelのカラム名(26進数ぽ)を数値(10進数)へ変換。頑張れ日本のC#er

投稿2017/09/22 06:54

編集2017/09/22 08:02
lain

総合スコア161

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

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

cancat

2017/09/22 07:03

ありがとうございます。 いまいちイメージできないです。・・・。
cancat

2017/09/22 07:35

サンプルコードありがとうございます。 質問にも追記しましたが、F-F,G-Pを出力するのでなく、その差分の回数だけくりかえし処理をしたいのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問