私は自分が望むものに対して機能するソリューションを持っていますが、私が持っているものを改善し、その過程で何か新しいことを学ぶのに役立ついくつかの洗練された LINQ 型を取得したいと考えています。
以下のコードは、特定の列名がスプレッドシートに存在することを確認するために使用されます。列のインデックス値を使用するか、列名を使用してそれらを見つけるかで迷っていました。どちらも一長一短ありますが、カラム名で行くことにしました。私はこれに取り組んでいますが、それらは常に存在し、時には異なる順序で存在します.
詳細: GetData() メソッドはDataTable
、Excel スプレッドシートから を返します。配列から必要なすべてのフィールド名を順番に調べて、スプレッドシートの列コレクション内の何かと一致するかどうかを確認します。そうでない場合は、不足している列名をメソッドからの出力パラメーターに追加します。ブール値と不足しているフィールド変数の両方が必要ですが、出力パラメーターを使用するよりも良い方法がわかりませんでした。次に、UI に表示するために、追加された文字列から最後のコンマを削除します。オブジェクトが null でない場合StringBuilder
(missingFieldCounter も使用できたはずです)、欠落しているフィールドが少なくとも 1 つあることがわかり、bool は false になります。それ以外の場合は、出力パラメーターを空として返し、メソッドを true として返します。
では、フィールドが欠落しているかどうかを確認し、何らかの方法でそれらを報告する、より洗練されたオールインワンの方法はありますか?
private bool ValidateFile(out string errorFields)
{
data = GetData();
List<string> requiredNames = new [] { "Site AB#", "Site#", "Site Name", "Address", "City", "St", "Zip" }.ToList();
StringBuilder missingFields = null;
var missingFieldCounter = 0;
foreach (var name in requiredNames)
{
var foundColumn = from DataColumn c in data.Columns
where c.ColumnName == name
select c;
if (!foundColumn.Any())
{
if (missingFields == null)
missingFields = new StringBuilder();
missingFieldCounter++;
missingFields.Append(name + ",");
}
}
if (missingFields != null)
{
errorFields = missingFields.ToString().Substring(0, (missingFields.ToString().Length - 1));
return false;
}
errorFields = string.Empty;
return true;
}