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

このQ&Aのポイント
  • C#の勉強をはじめたところです。以下のコードの”ここが不明”と書いてあるところの意味を教えてください。x => x.FilePath == pathこの意味が特に分かりません。
  • bool DoesNeedBackup関数は、与えられたファイルと時間のリストとフォルダパス、ファイルパスを比較してバックアップが必要かどうかを判定します。ファイルと時間のリストの要素数とフォルダパス、ファイルパスの要素数が一致しない場合はバックアップが必要と判断されます。
  • FileAndTimeクラスは、ファイルのパスと時間の情報を保持するクラスです。コンストラクタでパスと時間を受け取り、プロパティとして公開しています。IsCheckedプロパティは、ファイルがチェックされたかどうかを示します。
回答を見る
  • ベストアンサー

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; }

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

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

  • ベストアンサー
  • _kappe_
  • ベストアンサー率68% (1522/2216)
回答No.1

x => x.FilePath == path この部分はラムダ式と呼ばれるものです。詳しくはリンク先を参照してください。 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/lambda-expressions fileAndTimes.FirstOrDefault(x => x.FilePath == path) ここで、fileAndTimesという変数はFileAndTimeクラスのオブジェクトを要素とするListです。FirstOrDefault()はそのListの中で条件を満たす最初のものを返します。その条件を表すのにラムダ式を使っています。条件を満たすものがfileAndTimesに含まれていなければデフォルト値であるnullを結果として返します。 Enumerable.FirstOrDefaultメソッドの説明はリンク先を参照してください。 https://docs.microsoft.com/ja-jp/dotnet/api/system.linq.enumerable.firstordefault

gennya
質問者

お礼

回答ありがとうございました。 理解が深まり大変参考になりました。 そこでまたいろいろ調べてようやく自分なりに理解しました。 xはList fileAndTimesの一つの要素 =>は右矢印の意味で右側の式にxを代入 ==は同じであるかどうかの判定式 fileAndTimes.FirstOrDefault(x => x.FilePath == path)

関連するQ&A

  • 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; }

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

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

  • 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; } 初心者なんで、やさしく教えてください。お願いします。

  • interface プロパティ

    【ケース1】 class Class1 { public string str { get; set; } public int x { get; set; } } 【ケース2】 class Class1 : Class2, Class3 { public string str { get; set; } public int x { get; set; } } interface Class2 { int x { get; set; } } interface Class3 { string str { get; set; } } インターフェースのプロパティの実装をしています、【ケース2】です。 これと【ケース1】ってどこがどう違うのでしょうか?何か同じな感がぬぐえません class2とclass3のプロパティを再定義してるという感がしません。。 実装の仕方がまちがってる場合はご指摘ください。お願いします。

    • ベストアンサー
    • Java
  • phpのマニュアルの質問です。

    phpのマニュアルの見方がいまいち分かりません。 http://www.php.net/manual/ja/function.fopen.php resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] ) 上記の例ですと、 ◎「string」「bool」これはどういう意味でしょうか?続くのが必ず変数なのはなぜでしょうか? ◎関数の中の引数の[ ]大カッコは何を意味してるでしょうか? 初歩的な質問ですが教えてください。

    • ベストアンサー
    • PHP
  • 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# インターフェイスの実装

    インターフェイスの実装でエラーが出て困っています。 「'(略).SeatCondition' はインターフェイスメンバ '(略)ICondtion.Judge(略)を実装しません。」 とエラー表示されます。 //条件判定クラスのInterface public interface ICondtion { bool Judge(RsvReservEmptySearchPerson.ReserveData aReserve); } //曜日判定のクラス public class DayOfWeekCondition : ICondtion // こちらはエラーがでない { private DayOfWeek mExpectedDayOfWeek; public DayOfWeekCondition(DayOfWeek aDayOfWeek) { mExpectedDayOfWeek = aDayOfWeek; } public bool Judge(RsvReservEmptySearchPerson.ReserveData aReserve) { if (aReserve.Date.DayOfWeek == mExpectedDayOfWeek) { return true; } return false; } } //ユニット判定のクラス public class SeatCondition : ICondtion // ここにエラーが出る。 { private string mExpectedSeatId; public SeatCondition(string aSeatId) { mExpectedSeatId = aSeatId; } public bool Judge(RsvReservEmptySearchPerson.ReserveData aReserve) { foreach (RsvSeatData tSeat in aReserve.Seats) { if (tSeat.Id == mExpectedSeatId) { return true; } } return false; } } どこがおかしいのかわかりません。 ご教示お願いします。

  • トークンとCSRF対策

    // 1. トークンの生成 function get_csrf_token(){ // get_random_string()はユーザー定義関数。 $token = get_random_string(30); // set_session()はユーザー定義関数。 // CSRFのトークンを生成してセッションに格納したものを返す set_session('csrf_token', $token); // $_SESSION['csrf_token'] = $token; return $token; } // 2.トークンのチェック function is_valid_csrf_token($token){ if($token === '') { return false; } // 引数に与えられたもの$tokenと$_SESSION[‘csrf_token’]とを比較して // 合っていればtrue、そうでなければfalseを返す return $token === get_session('csrf_token'); // $_SESSION['csrf_token']; } function get_random_string($length = 20){ return substr(base_convert(hash('sha256', uniqid()), 16, 36), 0, $length); } get_csrf_token()とis_valid_csrf_token($token)は修正せずに、「if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_SESSION['csrf_token'] === $_POST['csrf_token']) {} 」と同じ意味にするには、どのような処理(if文)を追加すればいいですか?

    • ベストアンサー
    • PHP
  • 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クラスが上手く使えず、経過時間がマイナスになってしまいます。アドバイスお願いします。

専門家に質問してみよう