循环遍历DataTable并只选择column中的某些值
本文关键字:column 选择 遍历 DataTable 循环 | 更新日期: 2023-09-27 18:06:27
我有一个DataTable从中我想循环通过每一行和列,然后选择一个值从一个特定的列取决于在列/每一行的其他值。
我的代码现在看起来像这样:
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>
,它包含我想与我的数据表进行比较的数据。
string outDraws
只是一个字符串,它应该包含我想打印出来的图纸的内容。
我现在的问题是,我只想打印出行'Drawing'列的内容,其中所有与ImportData中的键同名的列都具有'X'作为值。目前,我得到所有的行,其中任何列有"X"作为值,并具有相同的名称在ImportData中的任何键。
我知道这对你来说很难得到我想做的,但如果你需要更多的信息,请问我,我会尽量提供。
提前感谢。
编辑:ImportData包含不同产品的名称作为键。这些产品要么被客户通过另一个程序选中,要么没有被客户选中,如果被选中,则值为true,如果没有被选中,则值为false。
使用上面提供的方法,我想将所有值为true的键与DataTable中的列名进行比较。如果列名对应于ImportData中的键(这是产品的名称),那么我想检查特定行中该列的值是否为'X'。
这适用于ImportData中的所有键,最后我应该知道DataTable中的哪一行在所有列中具有与ImportData中的键同名的"X"。对于这一行,我想获得名为"Drawing"的列的内容。例如,ImportData包含:
[Motor, true][Product6, true][Product7, true]
然后我要打印出第6行的Drawing列。
遗憾的是我不能上传图片
和处理任何问题一样:分而治之。把你的问题分解成更小的部分,然后从那里开始。
据我所知,您想对数据表中的某些行做一些事情。比如:
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
}
现在你的问题被简化为思考"满足某些条件"意味着什么。一旦你可以清楚地用文字表达,重命名函数以反映这一点(例如为'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'
}
试试这个
DataTable tbl = new DataTable();
foreach (DataRow row in tbl.Rows)
{
object cellData = row["colName"];
}