28") # DataRow[] を DataTable に変換(CopyToDataTableを使用) if ($selectedRows.Count -gt 0) { # 結果をテーブル形式で表示 $selectedRows | Format-Table -AutoSize } else { Write-Host "条件に合致する行がありません。" } # 後処理:テーブルと検索結果を解放 $selectedTable = $null $selectedRows = $null $table = $null $row = $null # ガベージコレクションを強制的に実行 [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()"> 28") # DataRow[] を DataTable に変換(CopyToDataTableを使用) if ($selectedRows.Count -gt 0) { # 結果をテーブル形式で表示 $selectedRows | Format-Table -AutoSize } else { Write-Host "条件に合致する行がありません。" } # 後処理:テーブルと検索結果を解放 $selectedTable = $null $selectedRows = $null $table = $null $row = $null # ガベージコレクションを強制的に実行 [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()"> 28") # DataRow[] を DataTable に変換(CopyToDataTableを使用) if ($selectedRows.Count -gt 0) { # 結果をテーブル形式で表示 $selectedRows | Format-Table -AutoSize } else { Write-Host "条件に合致する行がありません。" } # 後処理:テーブルと検索結果を解放 $selectedTable = $null $selectedRows = $null $table = $null $row = $null # ガベージコレクションを強制的に実行 [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()">
# DataTableオブジェクトを作成
$table = New-Object System.Data.DataTable
# 列を追加
$table.Columns.Add("ID", [int])
$table.Columns.Add("Name", [string])
$table.Columns.Add("Age", [int])
# 行を追加
$row = $table.NewRow()
$row["ID"] = 1
$row["Name"] = "Alice"
$row["Age"] = 30
$table.Rows.Add($row)
$row = $table.NewRow()
$row["ID"] = 2
$row["Name"] = "Bob"
$row["Age"] = 25
$table.Rows.Add($row)
$row = $table.NewRow()
$row["ID"] = 3
$row["Name"] = "Charlie"
$row["Age"] = 35
$table.Rows.Add($row)
# Selectメソッドを使用して条件に合う行を取得
$selectedRows = $table.Select("Age > 28")
# DataRow[] を DataTable に変換(CopyToDataTableを使用)
if ($selectedRows.Count -gt 0) {
# 結果をテーブル形式で表示
$selectedRows | Format-Table -AutoSize
} else {
Write-Host "条件に合致する行がありません。"
}
# 後処理:テーブルと検索結果を解放
$selectedTable = $null
$selectedRows = $null
$table = $null
$row = $null
# ガベージコレクションを強制的に実行
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
説明:
$selectedRows.CopyToDataTable()
を使用して、DataRow[]
を新しいDataTable
に変換します。$selectedRows
が空の場合、CopyToDataTable
メソッドはエラーになるため、if
文で行数をチェックしています。$selectedTable | Format-Table -AutoSize
で、選択されたデータをテーブル形式で一括表示します。$selectedTable = $null
$selectedRows = $null
$table = $null
$row = $null
これらの変数を $null
に設定することで、オブジェクトへの参照を解放します。[System.GC]::Collect()
を使用して、ガベージコレクターに不要なオブジェクトの回収を促します。[System.GC]::WaitForPendingFinalizers()
で、保留中のファイナライザーが完了するまで待機します。注意事項:
IDisposable
インターフェイスを実装していないため、Dispose()
メソッドは存在しません。$null
に設定し、ガベージコレクションを実行します。実行結果:
ID Name Age
-- ---- ---
1 Alice 30
3 Charlie 35
このスクリプトは、ループを使用せずにDataTable
から条件に合うデータを選択し、テーブル形式で出力しています。
行の追加を foreach
ループで行い、年齢を乱数に設定し、名前を "name_ID番号"
とするようにスクリプトを修正します。また、検索方法に LINQ を使用した場合も追加します。
# DataTableオブジェクトを作成
$table = New-Object System.Data.DataTable
# 列を追加
$table.Columns.Add("ID", [int])
$table.Columns.Add("Name", [string])
$table.Columns.Add("Age", [int])
# 乱数を生成するためのRandomオブジェクトを作成
$random = New-Object System.Random
# 行を追加(IDが1から10まで)
foreach ($id in 1..10) {
$row = $table.NewRow()
$row["ID"] = $id
$row["Name"] = "name_$id"
$row["Age"] = $random.Next(20, 50) # 20から49の乱数
[void]$table.Rows.Add($row)
}
# DataTableの内容を表示
Write-Host "=== 生成されたデータテーブル ==="
$table | Format-Table -AutoSize
# LINQを使用してAgeが30以上の行を選択
Add-Type -AssemblyName 'System.Data.DataSetExtensions'
$selectedRows = [System.Data.DataTableExtensions]::AsEnumerable($table) | Where-Object { $_['Age'] -ge 30 }
# DataRow[] を DataTable に変換(CopyToDataTableを使用)
if ($selectedRows.Count -gt 0) {
# 結果をテーブル形式で表示
Write-Host "`n=== LINQを使用した検索結果(Age >= 30) ==="
$selectedRows | Format-Table -AutoSize
} else {
Write-Host "条件に合致する行がありません。"
}
# 後処理:テーブルと検索結果を解放
$selectedTable = $null
$selectedRows = $null
$table = $null
$row = $null
$random = $null
# ガベージコレクションを強制的に実行
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()
説明:
foreach
で行う:
$random = New-Object System.Random
で乱数生成器を作成します。foreach ($id in 1..10)
で ID が 1 から 10 までのループを実行します。"Name"
列に "name_$id"
を設定します。"Age"
列には $random.Next(20, 50)
を使用して 20 から 49 の乱数を設定します。$table | Format-Table -AutoSize
で表示します。