C# Listとclassが絡んだコードの分析とfileAndTimesの中身の出力方法

このQ&Aのポイント
  • C#の勉強を始めました。鳩でもわかるC#(増分バックアップ)を参考に勉強してますが、vs2[0]とvs2[1]の2つの変数の塊をどんどん繋いでいるのかなと想像するのですが、厳密には何が起きているのか分かりません。このコードは何をやっているのでしょうか?fileAndTimesの中身を出力に書き出すはどんなコードを書けばよいでしょうか?詳しい方ご教示願います。
  • C#の勉強をしている中で、複数のクラスが組み合わさったコードに出会いましたが、そのコードが何をしているのか理解できません。具体的には、vs2[0]とvs2[1]という変数がどんどん繋がっているようですが、詳細はわかりません。また、fileAndTimesの中身を出力に書き出す方法もわかりません。誰か詳しい方に教えていただけないでしょうか?
  • C#の勉強をしています。現在、vs2[0]とvs2[1]という変数が絡んだコードを理解しようとしていますが、正確な動作やfileAndTimesの中身を出力する方法がわかりません。どなたか教えていただけないでしょうか?
回答を見る
  • ベストアンサー

C# Listとclassが絡んだコードが分かりま

C#の勉強を始めました。 鳩でもわかるC#(増分バックアップ)を参考に勉強してますが、以下のコードが分かりません。 コードの雰囲気から、vs2[0]とvs2[1]の2つの変数の塊をどんどん繋いでいるのかなと想像するのですが、 厳密には何が起きているのか分かりません。 fileAndTimesの中が覗ければ、理解が深まるのかとも思うのですが、私にはできません。 このコードは何をやっているのでしょうか? また、fileAndTimesの中身を出力に書き出すはどんなコードを書けばよいでしょうか? 詳しい方ご教示願います。 ///////////////////////////// List<FileAndTime> CreateFileAndTimes(string logFilePath) {      ・      ・      ・ FileAndTime fileAndTime = new FileAndTime(vs2[0], long.Parse(vs2[1])); fileAndTimes.Add(fileAndTime);      ・      ・      ・ return fileAndTimes; } internal class FileAndTime { public FileAndTime(string path, long tick) { FilePath = path; Tick = tick; } public long Tick { get; protected set; } = 0; public string FilePath { get; protected set; } = ""; public bool IsChecked { get; set; } = false; }

  • gennya
  • お礼率90% (1050/1160)

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (740/5644)
回答No.1

以下の点が不明なので、何をやっているかの判断が難しいです。 ・vs2の定義 ・fileAndTimesの定義 ・CreateFileAndTimesの呼び出し fileAndTimesの中身を出力に書き出すのは面倒なので、 ブレークポイントを付けてみてください。 確認したい場所、たとえば、 return fileAndTimes; この行でF9キーを押してみてください。 左に赤い丸が表示されたらブレークポイントになります。 それで実行すると、 ブレークポイントのところで処理が一旦停止します。 画面の左下に自動と言うウィンドウが表示されて、 fileAndTimesが表示されると思います。 そこの▷をクリックするとツリーが広がりますので、 内容が確認できると思います。 処理を続行するにはF5キーを押してください。

gennya
質問者

お礼

回答ありがとうございました。 教えていただいた変数の見方はうまくいきました。 これで理解が少し進みました。 なぜ、こんな複雑?な処理をしているのか今は分かりませんが、次のステップでこの結果をどのようにつかっているのかを理解できれば、今回のコードの意味も見えてくると思います。 まあ、次のコードの方がもっと難しいのですけどね。

gennya
質問者

補足

回答ありがとうございます。 以下補足させていただきます。 ・vs2の定義   List<FileAndTime> CreateFileAndTimes(string logFilePath) { List<FileAndTime> fileAndTimes = new List<FileAndTime>(); StreamReader sr = new StreamReader(logFilePath); string str = sr.ReadToEnd(); sr.Close(); string[] vs1 = str.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); foreach(string line in vs1) { string[] vs2 = line.Split(new string[] { "::" }, StringSplitOptions.RemoveEmptyEntries); if(vs2.Length != 2) continue; FileAndTime fileAndTime = new FileAndTime(vs2[0], long.Parse(vs2[1])); fileAndTimes.Add(fileAndTime); } return fileAndTimes; } } ・fileAndTimesの定義 質問に記載したコードしかないと思います。 ・CreateFileAndTimesの呼び出し if(lastLogFilePath != "") { fileAndTimes = CreateFileAndTimes(lastLogFilePath); if(!DoesNeedBackup(fileAndTimes, folderPaths, filePaths)) { MessageBox.Show("バックアップをとる必要があるファイルは見つかりませんでした", "報告", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } }

関連するQ&A

  • C# コードの意味を教えてください

    C#の勉強をはじめたところです。 以下のコードの ”ここが不明” とかいてあるところの意味を教えてください。  x => x.FilePath == pathこの意味が特に分かりません。 /////////////////////////// bool DoesNeedBackup(List<FileAndTime> fileAndTimes, string[] folderPaths, string[] filePaths) { if(fileAndTimes.Count != folderPaths.Length + filePaths.Length) return true; bool doesNeed = false; foreach(string path in filePaths) { FileAndTime fileAndTime = fileAndTimes.FirstOrDefault(x => x.FilePath == path);←ここが不明 ・   ・   ・ } クラスの定義 public class FileAndTime { public FileAndTime(string path, long tick) { FilePath = path; Tick = tick; } public long Tick { get; protected set; } = 0; public string FilePath { get; protected set; } = ""; public bool IsChecked { get; set; } = false; }

  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • C#プロパティが変わったらイベントがほしい

    C#でクラスを作成していますが、クラス内でとある条件になるとプロパティに値が設定されます。その時、メインのプログラムから感知できませんか? class Class1 { public string MyProperty { get; set; } public void ReadText() { bool ret = false; if (ret) MyProperty = "発見しました。"; } } 上記サンプルでMyPropertyがセットされた時、上位プログラムで処理を行いたいです。 お願いします。

  • UWSCでファイルダイアログからフルパスを取得したい(APIコード有り)

    UWSCでダイアログを表示し、ユーザーにファイルを選択させ、Excelファイルをオープンしたいと思っています。ファイルダイアログのソースはネットで見つけました。 しかし、APIの知識はまったく無いので下記コードの意味がわかりません。 最終的にやりたいことは、戻値 = XLOPEN( [ファイル名] ) 関数を利用して、「ファイル名」の所にユーザーが選択したファイルのフルパスを入力したいです。 下記のAPIのコードを使ってどのようにフルパスを取得することができますでしょうか? よろしくお願いいたします。 ///////////////////////////////////////////////////////////////////////////////   v_Path = FileOpenDLG.Get(v_Path)   Module FileOpenDLG     DEF_DLL GetOpenFileNameA({Long, Long, Long, var string, var string, Long, Long _                  , var pchar, Long, var pchar, Long, var string, var string _                  , Long, DWORD, var string, Long, Long, var string}): Bool: COMDLG32     CONST STRUCT_SIZE = 76   // 構造体のサイズ     CONST OFN_HIDEREADONLY = $4   // 書き込み禁止(Read Only)のチェックボックスを非表示。     CONST OFN_FILEMUSTEXIST = $1000  // 存在しないファイルを選択できないようにする。     CONST OFN_EXPLORER = $80000 // ダイアログボックスをエクスプローラ風にする。     Dim Flag = OFN_HIDEREADONLY or OFN_FILEMUSTEXIST or OFN_EXPLORER     Dim Len_1024 = $400     Dim Buff_1024 = Format(ChrB(0), This.Len_1024)     Dim Name     Dim Title = "Excelファイルを選択。"     Dim ExtFilter = "Excel (*.xls)" + ChrB(0) + "*.xls" + ChrB(0) _             + "全て (*.*)" + ChrB(0) + "*"     Dim DefaultDir = null  // 初期表示ディレクトリ null は CurrentDirectory。     Function Get(var v_Path)       v_Path = This.Buff_1024       This.Name = This.Buff_1024       Result = GetOpenFileNameA(_         STRUCT_SIZE, 0, 0, This.ExtFilter + ChrB(0), NULL, 0, 0 _         , v_Path, This.Len_1024, This.Name, This.Len_1024, This.DefaultDir, This.Title _         , This.Flag, 0, NULL, 0, 0, NULL)     FEnd   EndModule ///////////////////////////////////////////////////////////////////////////////

  • C# DataGridView列カスタマイズ

    C#でDataGridViewの列にNumericUpDownにしたくカスタマイズを行っています。 http://msdn.microsoft.com/ja-jp/library/7tas5c80(VS.80).aspx こちらのサイトを参考にし以下のソースになりました。 public class NumericUpDownColumn : DataGridViewColumn { public NumericUpDownColumn() : base(new NumericUpDownCell()) { } public override DataGridViewCell CellTemplate { get { return base.CellTemplate;   } set { base.CellTemplate = value; } } } public class NumericUpDownCell : DataGridViewTextBoxCell { public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); NumericUpDownCellEditingControl ctl = DataGridView.EditingControl as NumericUpDownCellEditingControl; if (this.Value != null) ctl.Value = decimal.Parse(this.Value.ToString()); } public override Type EditType { get { return typeof(NumericUpDownCellEditingControl); } } public override Type ValueType { get { return typeof(decimal); } } public override object DefaultNewRowValue { get { return (decimal)0; } } } class NumericUpDownCellEditingControl : NumericUpDown, IDataGridViewEditingControl { DataGridView dataGridView; private bool valueChanged = false; int rowIndex; public object EditingControlFormattedValue { get { return this.Value; } set { String newValue = value as String; if (newValue != null) { this.Value = decimal.Parse(newValue); } } } public object GetEditingControlFormattedValue( DataGridViewDataErrorContexts context) { return EditingControlFormattedValue; } public void ApplyCellStyleToEditingControl( DataGridViewCellStyle dataGridViewCellStyle) { this.Font = dataGridViewCellStyle.Font; } public int EditingControlRowIndex { get { return rowIndex; } set { rowIndex = value; } } public bool EditingControlWantsInputKey( Keys key, bool dataGridViewWantsInputKey) { switch (key & Keys.KeyCode) { case Keys.Left: case Keys.Up: case Keys.Down: case Keys.Right: return true; default: return false; } } public bool RepositionEditingControlOnValueChange { get { return false; } } public DataGridView EditingControlDataGridView { get { return dataGridView; } set { dataGridView = value; } } public bool EditingControlValueChanged { get { return valueChanged; } set { valueChanged = value; } } public Cursor EditingPanelCursor { get { return base.Cursor; } } protected override void OnValueChanged(EventArgs eventargs) { valueChanged = true; this.EditingControlDataGridView.NotifyCurrentCellDirty(true); base.OnValueChanged(eventargs); } } } デザイン画面で列を追加し実行。グリッド上のNumericUpDownで数値を変更し 違うセルを選択すると「セルのフォーマットされた値に間違った型が指定されていますと例外がでます。場所はDataGridViewCellのParseFormattedValueでした。 どのようにすれば例外がでなくなるでしょうか。ちょっと文字数の関係上色々はしょってしまってます。 よろしくお願いします。

  • C#のタイマーについて

    タイマーのプログラムを作っています。 namespace WindowsApplication3 { public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label4; protected System.Windows.Forms.Label label5; protected System.Windows.Forms.Label label6; protected System.Windows.Forms.Button button1; protected System.Windows.Forms.Button button2; protected DateTime dt; protected DateTime recTime; private System.Windows.Forms.GroupBox groupBox1; protected System.Windows.Forms.RadioButton radioButton1; protected System.Windows.Forms.RadioButton radioButton2; private System.Windows.Forms.Timer timer1; private System.ComponentModel.IContainer components; public Form1() { // // Windows フォーム デザイナ サポートに必要です。 // InitializeComponent(); DateTime dt; dt=DateTime.Now; string a="00"; string b=a; string c=a; label4.Text = string.Format("{0}時{1}分{2}秒", dt.Hour, dt.Minute,dt.Second); label5.Text = string.Format("{0}時{1}分{2}秒",a,b,c); label6.Text = string.Format("{0}時間{1}分{2}秒",a,b,c); // // TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。 // dt=DateTime.Now; } /// <summary> /// 使用されているリソースに後処理を実行します。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows フォーム デザイナで生成されたコード /// <summary> /// デザイナ サポートに必要なメソッドです。このメソッドの内容を /// コード エディタで変更しないでください。 <<  文字数オーバーのため 省略>> /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } private void button2_Click(object sender, System.EventArgs e) { Application.Exit(); } protected void timer1_Tick(object sender, System.EventArgs e) { DateTime dt; dt=DateTime.Now; label4.Text = string.Format("{0}時{1}分{2}秒", dt.Hour, dt.Minute,dt.Second); } protected void button1_Click(object sender, System.EventArgs e) { DateTime recTime; recTime=DateTime.Now; TimeSpan k; k=dt-recTime; label5.Text=string.Format("{0}時{1}分{2}秒",recTime.Hour,recTime.Minute,recTime.Second); label6.Text=string.Format("{0}秒",k.Seconds); } } } このプログラムでは ボタン1をクリックするとlabel6に経過時間 label5に記録時間を出力させたいのですが、TimeSpanクラスが上手く使えず、経過時間がマイナスになってしまいます。アドバイスお願いします。

  • switchでエラー

    Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or `T_NUM_STRING' in C:\path\file.php on line 11 この行を見る限りどこも悪くは無い気がしますが・・・ (ヒアドキュメント) 10:HEADER_HTML; 11:switch ($_GET['mode']){ 12: case 'edit': どこが悪いのでしょうか。

    • ベストアンサー
    • PHP
  • C#での関数テーブルの作り方

    お世話様です。 C++で関数ポインタを使用していたのですが、C#にそのまま持ってくると エラーが発生します。 C++でのコードをどのように変更したら良いでしょうか。 [C++] typedef struct {  char *cmd;  BOOL (*exe)(char* oprand); }FTBL; FTBL tbl[] = {  { "AAA", aaa },  { "BBB", bbb },  { "CCC", ccc } }; [C#](当方のコードでエラーがでます。) delegate bool Execute( string oprand ); struct FTBL{  string cmd;  Execute exe; }; FTBL[] tbl = {  { "AAA", aaa },  { "BBB", bbb },  { "CCC", ccc } }; コマンド名とコマンド関数のテーブルですが、要は関数テーブルの 作り方を知りたいのです。 ご教授よろしくお願いいたします。

  • C# Listクラスにクラスを追加したいがエラー

    以下のようなコードを書いたのですが (A)(B)の箇所で (A) error CS1513: } が必要です。 (B) /error CS1022:型、名前空間の定義、またはファイルの終わりが必要です。 というエラーになるのですが、なにが間違っているのでしょうか。 --------------------------------------------------- using System; using System.Collections.Generic; namespace My {  class MyClass  {   public static void Main()   { // <--- (A)    public List<Book> myList = new List<Book>    {     new Book(){ title = "ABC", price = 1000 },     new Book(){ title = "DEF", price = 2000 }    };   }  }  class Book  {   //プロパティの自動実装   public string title { get; set; }   public decimal price { get; set; }  } } // <--- (B) ---------------------------------------------------

  • C#で配列の戻り値について

    プログラミング初心者で、ただいまC#の勉強中です。 bool型(trueまたはfalse)とstring型(関数内で取得した文字列)の値を 配列で関数の戻り値として返したいのですが、どうすれば良いのかわかりません。 true/falseもstringとして呼び出し側で判別するしか方法はないのでしょうか。 アドバイスをお願いいたします。

専門家に質問してみよう