循环遍历 DataTable 和 select 仅列中的某些值
Loop through DataTable and select only certain values in column
我有一个数据表,我想从中遍历每一行和每一列,然后根据 columns/each 行中的其他值 select 来自特定列的值。
我的代码目前是这样的:
foreach (DataRow drow in dt.Rows)
{
foreach (DataColumn dcol in dt.Columns)
{
foreach (var Item in ImportData)
{
if (Item.Value.Equals(true))
{
if (Item.Key.Equals("" + dcol))
{
string value = drow[dcol].ToString();
if (value.Equals("X"))
{
outDraws += drow["Drawing"].ToString();
outDraws += "\n";
}
}
}
}
}
}
ImportData 是一个 Dictionary<string, bool>
,它包含我要与我的 DataTable 进行比较的数据。
string outDraws
只是一个字符串,应该包含我要打印的图纸的内容。
我现在的问题是,我只想打印出与 ImportData 中的键同名的所有列的值为 'X' 的行的 'Drawing' 列中的内容。目前,我正在获取任何列的值都为 'X' 并且与 ImportData 中的任何键同名的所有行。
我知道你很难得到我想做的事情,但请询问你是否需要更多信息,我会尽力提供。
非常感谢。
编辑:
ImportData 包含不同产品的名称作为键。这些产品已被客户通过另一个程序 selected 或未被 selected,如果它们已被 selected,则其值为 true,如果未被 selected,则其值为 false。
使用上面介绍的方法,我想将所有值为 true 的键与 DataTable 中的列名进行比较。如果列名对应于 ImportData 中的键(这是产品的名称),那么我想检查特定行中的该列是否具有 'X' 作为值。
这适用于 ImportData 中的所有键,最后我应该知道 DataTable 中的哪一行在所有列中具有与 ImportData 中的键同名的 'X'。对于这一行,我想获取名为 'Drawing' 的列的内容。
例如,ImportData 包含:
[电机,正确][Product6,正确][Product7,正确]
然后我想打印出第 6 行的绘图列。
可惜我不能post图片..
试试这个
DataTable tbl = new DataTable();
foreach (DataRow row in tbl.Rows)
{
object cellData = row["colName"];
}
与任何问题一样:分而治之。把你的问题分解成更小的部分,然后从那里开始。
据我了解,您想对数据表中的某些行执行某些操作。类似于:
foreach (var drow in dt.Rows.OfType<DataRow>())
{
if (SomeConditionIsMet(dt, drow, ImportData))
{
outDraws += drow["Drawing"].ToString();
outDraws += "\n";
}
}
函数 SomeConditionIsMetcould 如下所示:
private static bool SomeConditionIsMet(
DataTable dt, DataRow drow,
IDictionary<string, bool> importData)
{
// TODO if the condition is met, return true
// otherwise, return false
}
现在您的问题已简化为思考 'Some condition is met' 的含义。一旦你可以用文字清楚地表达出来,重命名函数以反映这一点(例如 'AllColumnsAreChecked')
根据我的理解,这是一个带有解决方案的示例:
internal class Program
{
private static void Main(string[] args)
{
var importData = new Dictionary<string, bool>()
{
{"Product1", true},
{"Product2", false},
{"Product3", true},
};
var dt = new DataTable();
dt.Columns.Add("Product1");
dt.Columns.Add("Product2");
dt.Columns.Add("Product3");
dt.Columns.Add("Product4");
dt.Columns.Add("Drawing");
// row1 should be added
var row1 = dt.NewRow();
row1["Product1"] = "X";
row1["Product3"] = "X";
row1["Drawing"] = "Drawing1";
dt.Rows.Add(row1);
// row2 should not be added
var row2 = dt.NewRow();
row2["Product1"] = "X";
row2["Drawing"] = "Drawing2";
dt.Rows.Add(row2);
string outDraws = string.Empty;
foreach (DataRow drow in dt.Rows.OfType<DataRow>())
{
if (AllColumnsAreChecked(drow, importData))
{
outDraws += drow["Drawing"].ToString();
outDraws += "\n";
}
}
Console.WriteLine(outDraws);
}
private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData)
{
foreach (var key in importData.Keys)
{
if (!importData[key])
continue;
var value = drow[key] as string;
if (value != "X")
return false;
}
}
}
奖励:这是一个基于 LINQ 的检查实现:
private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData)
{
return importData.Keys
.Where(k => importData.ContainsKey(k) && importData[k]) // the field must be enabled in importData
.All(k => (drow[k] as string) == "X"); // the corresponding value in the row must be 'X'
}
我有一个数据表,我想从中遍历每一行和每一列,然后根据 columns/each 行中的其他值 select 来自特定列的值。
我的代码目前是这样的:
foreach (DataRow drow in dt.Rows)
{
foreach (DataColumn dcol in dt.Columns)
{
foreach (var Item in ImportData)
{
if (Item.Value.Equals(true))
{
if (Item.Key.Equals("" + dcol))
{
string value = drow[dcol].ToString();
if (value.Equals("X"))
{
outDraws += drow["Drawing"].ToString();
outDraws += "\n";
}
}
}
}
}
}
ImportData 是一个 Dictionary<string, bool>
,它包含我要与我的 DataTable 进行比较的数据。
string outDraws
只是一个字符串,应该包含我要打印的图纸的内容。
我现在的问题是,我只想打印出与 ImportData 中的键同名的所有列的值为 'X' 的行的 'Drawing' 列中的内容。目前,我正在获取任何列的值都为 'X' 并且与 ImportData 中的任何键同名的所有行。
我知道你很难得到我想做的事情,但请询问你是否需要更多信息,我会尽力提供。
非常感谢。
编辑:
ImportData 包含不同产品的名称作为键。这些产品已被客户通过另一个程序 selected 或未被 selected,如果它们已被 selected,则其值为 true,如果未被 selected,则其值为 false。
使用上面介绍的方法,我想将所有值为 true 的键与 DataTable 中的列名进行比较。如果列名对应于 ImportData 中的键(这是产品的名称),那么我想检查特定行中的该列是否具有 'X' 作为值。
这适用于 ImportData 中的所有键,最后我应该知道 DataTable 中的哪一行在所有列中具有与 ImportData 中的键同名的 'X'。对于这一行,我想获取名为 'Drawing' 的列的内容。 例如,ImportData 包含:
[电机,正确][Product6,正确][Product7,正确]
然后我想打印出第 6 行的绘图列。
可惜我不能post图片..
试试这个
DataTable tbl = new DataTable();
foreach (DataRow row in tbl.Rows)
{
object cellData = row["colName"];
}
与任何问题一样:分而治之。把你的问题分解成更小的部分,然后从那里开始。
据我了解,您想对数据表中的某些行执行某些操作。类似于:
foreach (var drow in dt.Rows.OfType<DataRow>())
{
if (SomeConditionIsMet(dt, drow, ImportData))
{
outDraws += drow["Drawing"].ToString();
outDraws += "\n";
}
}
函数 SomeConditionIsMetcould 如下所示:
private static bool SomeConditionIsMet(
DataTable dt, DataRow drow,
IDictionary<string, bool> importData)
{
// TODO if the condition is met, return true
// otherwise, return false
}
现在您的问题已简化为思考 'Some condition is met' 的含义。一旦你可以用文字清楚地表达出来,重命名函数以反映这一点(例如 'AllColumnsAreChecked')
根据我的理解,这是一个带有解决方案的示例:
internal class Program
{
private static void Main(string[] args)
{
var importData = new Dictionary<string, bool>()
{
{"Product1", true},
{"Product2", false},
{"Product3", true},
};
var dt = new DataTable();
dt.Columns.Add("Product1");
dt.Columns.Add("Product2");
dt.Columns.Add("Product3");
dt.Columns.Add("Product4");
dt.Columns.Add("Drawing");
// row1 should be added
var row1 = dt.NewRow();
row1["Product1"] = "X";
row1["Product3"] = "X";
row1["Drawing"] = "Drawing1";
dt.Rows.Add(row1);
// row2 should not be added
var row2 = dt.NewRow();
row2["Product1"] = "X";
row2["Drawing"] = "Drawing2";
dt.Rows.Add(row2);
string outDraws = string.Empty;
foreach (DataRow drow in dt.Rows.OfType<DataRow>())
{
if (AllColumnsAreChecked(drow, importData))
{
outDraws += drow["Drawing"].ToString();
outDraws += "\n";
}
}
Console.WriteLine(outDraws);
}
private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData)
{
foreach (var key in importData.Keys)
{
if (!importData[key])
continue;
var value = drow[key] as string;
if (value != "X")
return false;
}
}
}
奖励:这是一个基于 LINQ 的检查实现:
private static bool AllColumnsAreChecked(DataRow drow, Dictionary<string, bool> importData)
{
return importData.Keys
.Where(k => importData.ContainsKey(k) && importData[k]) // the field must be enabled in importData
.All(k => (drow[k] as string) == "X"); // the corresponding value in the row must be 'X'
}