【问题标题】:Get DataRow if column names in a string array have matching values in a string array如果字符串数组中的列名在字符串数组中具有匹配值,则获取 DataRow
【发布时间】:2020-09-19 22:55:31
【问题描述】:

如果 [colName] 列表中的列名具有与 [grbByValue] 列表匹配的值,我正在尝试从 dtResult 数据表中获取 DataRow。我在下面的代码中的目标是让 [test1] 和 [test2] 从 dtResult 返回数据行,并且应该与 [update] 相同(这是硬编码的)。但在 test1 和 test2 中都有问题。 test1 有错误,不知道如何 fix 和 test2 返回 null。

rule 是一个如下所示的 DataTable:

针对rule 的每一行运行以下所有逻辑。

dtResult 也是一个 DataTable,如下所示:

编辑代码

string[] grpby = { "ageband","gender","code"};
List<string> grbByValue = new List<string>() { "1","85+","1","1010"};

        DataTable dtResult = new DataTable();
        DataColumn dc = dtResult.Columns.Add("id", typeof(int));
        dc.AutoIncrement = true;
        dc.AutoIncrementSeed = 1;
        dc.AutoIncrementStep = 1;

        dtResult.Columns.Add("DataSourceID");
        dtResult.Columns["DataSourceID"].DefaultValue = "1";
        dtResult.Columns.Add("RuleID");
        dtResult.Columns.Add("GroupBy0");
        dtResult.Columns.Add("GroupBy1");
        dtResult.Columns.Add("GroupBy2");
        dtResult.Columns.Add("GroupBy3");
        dtResult.Columns.Add("GroupBy4");
        dtResult.Columns.Add("GroupBy5");
        dtResult.Columns.Add("Result", typeof(decimal));
        dtResult.Columns["Result"].DefaultValue = 0.00;


        var colName = (from a in dtResult.Columns.Cast<DataColumn>()
                       where a.ColumnName.ToString().StartsWith("GroupBy")
                       select a.ColumnName).OrderBy(x => x).ToList();
        colName.Insert(0, "RuleID");
        colName = colName.GetRange(0, grbByValue.Count);

        //comment/UNCOMMENT below to test [test1]
        //DataRow z = dtResult.NewRow();
        //for (int i = 0; i < grbByValue.Count; i++)
        //{
        //    z[colName[i]] = grbByValue[i];
        //}
        //dtResult.Rows.Add(z.ItemArray);

        var distDtResult = dtResult.DefaultView.ToTable(true, colName.ToArray());
        bool exist = false;
        DataRow update = null;

        foreach (DataRow dr in distDtResult.Rows)
        {
            var row = dr.ItemArray.ToList();
            exist = row.SequenceEqual(grbByValue);
            if (exist == true)
            {
                //var test1 = (from t1 in distDtResult.AsEnumerable().Where(r => r.ItemArray == dr.ItemArray)
                //             join t2 in (from m in dtResult.AsEnumerable()
                //                         select new
                //                         {
                //                             //ideally the below column list will be derived from [colName] dynamically
                //                             RuleID = m.Field<string>("RuleID"),
                //                             GroupBy0 = m.Field<string>("GroupBy0"),
                //                             GroupBy1 = m.Field<string>("GroupBy1"),
                //                             GroupBy2 = m.Field<string>("GroupBy2")
                //                         }) on t1.ItemArray equals t2.ItemArray
                //             select new
                //             {
                //                 t2
                //             }).FirstOrDefault();

                update = dtResult.AsEnumerable().Where(r =>
                                                r.Field<int>("id") == 1 &&
                                                r.Field<string>("DataSourceID") == "1" &&
                                                r.Field<string>("RuleID") == "1" &&
                                                r.Field<string>("GroupBy0") == "85+" &&
                                                r.Field<string>("GroupBy1") == "1" &&
                                                r.Field<string>("GroupBy2") == "1010").FirstOrDefault();


                break;
            }
        }

        if (exist == false)
        {
            DataRow a = dtResult.NewRow();
            for (int i = 0; i < grbByValue.Count; i++)
            {
                a[colName[i]] = grbByValue[i];
            }
            dtResult.Rows.Add(a.ItemArray);

            var test2 = dtResult.AsEnumerable().Where(r => r.ItemArray.Equals(a.ItemArray)).FirstOrDefault();
            update = dtResult.AsEnumerable().Where(r =>
                                               r.Field<int>("id") == 1 &&
                                               r.Field<string>("DataSourceID") == "1" &&
                                               r.Field<string>("RuleID") == "1" &&
                                               r.Field<string>("GroupBy0") == "85+" &&
                                               r.Field<string>("GroupBy1") == "1" &&
                                               r.Field<string>("GroupBy2") == "1010").FirstOrDefault();

        }

【问题讨论】:

  • 您能提供一些示例输入吗?看起来它会存储在 grpby 中,但未在您的 sn-ps 中定义/填充。
  • @B.Witter - 我添加了示例输入。
  • 我认为这有帮助,但我不确定您的要求和提供的代码 sn-ps 的预期输出是否清楚。我们看不到rule 是什么,我们只能假设dtResultdr 的样子。这可能足以为您找到好的答案=D
  • @B.Witter 感谢您的建议。这里的第一个计时器。希望现在好多了。
  • 没问题,我们都从某个地方开始。我正在尝试自己对此进行建模以查看我们可以做什么,但我不确定dtResult 的某些示例行会是什么。而且grbByValue 似乎没有被使用,这是故意的吗?

标签: c# datatable


【解决方案1】:

这可能是一个很好的起点,至少可以更好地提出问题并找到答案。

string[] colName = { "RuleID", "GroupBy0", "GroupBy1", "GroupBy2" };

// "All the below logic is run for each row of rule"
// this goes through each row of the rule DataTable
foreach (DataRow rule in ruleTable.Rows)
{
    // This is going to be equivalent to the grpby variable you specified
    var groupRules = rule.Field<string>("GroupBy").ToString().Split("|");

    // Some sort of mapping may need to go here to go from "ageband" to "GroupBy0", "gender" to "GroupBy1", etc.

    foreach(DataRow row in dtResult.Rows)
    {
        DataTable distDtResult = dtResult.DefaultView.ToTable(true, colName);

        var updateTEST = from dr in distDtResult.AsEnumerable()
                         where dr.Field<string>("RuleID") == rule["RuleID"].ToString()
                         && dr.Field<string>("GroupBy0") == row["GroupBy0"].ToString() // ageband
                         && dr.Field<string>("GroupBy1") == row["GroupBy1"].ToString() // gender
                         && dr.Field<string>("GroupBy2") == row["GroupBy2"].ToString() // code
                         // more
                         select dr;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2020-06-11
    • 1970-01-01
    • 2022-06-29
    • 2013-09-16
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多