c#

【.net】[c#]LINQ ラムダ式 便利技/事例集

LINQ、ラムダ式 便利技特集です。
よく忘れるのでメモしておきます。


DataTableの更新

条件なしで更新


dtTest.AsEnumerable().Select(r => r["colName"] = false).ToList();

条件ありで更新


dtTest.AsEnumerable().Where(r => r.Field<string>("colName") == "a" || r.Field<string>("colName") == "b")
                     .Select(r => r["updateColName"] = false)
                     .ToList();

なぜToList()が必要なのかはわかりませんが、
ないと動きませんorz


既存のDictionary.Valueからフィールドを抽出し、新しいDictionaryを生成する


Dictionary<string, TypeOfField1> newDictionaly = oldDictionaly.ToDictionary(d => d.Key, d => d.Value.field1);


指定フォルダ内の、更新日時が新しいテキストファイル(.txt)を取得する


Directory.GetFiles("C:\file", "*.txt", SearchOption.TopDirectoryOnly).OrderByDescending(f => File.GetLastWriteTime(f)).FirstOrDefault();

更新日時以外は、

  • 作成日時:GetCreationTime
  • 最終アクセス日時:GetLastAccessTime

となります。


DataGridViewから、DataSourceを経由せずにデータを取得


DataGridViewRow target = dataGridView1.Rows.Cast<DataGridViewRow>().Where(r => (string)r.Cells["colName"].Value == "条件").SingleOrDefault();


LINQ OrderByでnullを後ろにもっていく方法

LINQでOrderByをかけると、なぜかNullが最初にきます。
DBの「ORDER BY」ルックに、最後に持っていきたい場合は下記のように指定します。

文字列の場合


List<string> list1 = new List<string>() { null, "文字列1", "文字列2", "文字列3" };
List<string> sortedStringList = list1.OrderByDescending(s => !string.IsNullOrEmpty(s)).ThenBy(s => s).ToList();

数値の場合


List<int?> list2 = new List<int?>() { null, 1, 2, 3 };
List<int?> sortedIntList = list2.OrderBy(i => i ?? int.MaxValue).ToList();

日付の場合


List<DateTime?> list3 = new List<DateTime?>() { null, DateTime.Now.AddDays(-1), DateTime.Now, DateTime.Now.AddDays(1) };
List<DateTime?> sortedDateTimeList = list3.OrderBy(d => d ?? DateTime.MaxValue).ToList();


指定した名前空間以下のすべてのクラスを取得


Assembly assm = Assembly.GetExecutingAssembly();
var types = assm.GetTypes()
    .Where(p => p.Namespace == "対象の名前空間")
    .OrderBy(o => o.Name)
    .Select(s => s);

他に思いついたら随時更新します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です