0

我正在使用 C# 2010。

我有一个我正在使用的 DataTable 对象,它具有以下结构(并填充了示例数据):

"name"    "ID"    "hiredate"    "termdate"
Bobby     1        5/1/2011       7/1/2011
Peggy     2        5/1/2011
Jenny     3        5/2/2011
Jenny     3        5/2/2013
Jenny     3        5/2/2011       6/1/2011
Peggy     2        5/1/2011

我想过滤此 DataTable 以仅保留不同的(“ID”、“hiredate”)组合。此外,如您所见,并非每个人都有“termdate”值。在决定要保留哪个不同的(“ID”、“hiredate”)组合时,我想保留一个也有“termdate”的组合。如果其中任何一个都没有“termdate”,那么丢弃哪个都没有关系。

因此,执行此操作后的结果表将是:

"name"    "ID"    "hiredate"    "termdate"
Bobby     1        5/1/2011       7/1/2011
Peggy     2        5/1/2011
Jenny     3        5/2/2013
Jenny     3        5/2/2011       6/1/2011

Jenny 有两个条目,因为她出现了两个不同的“雇用日期”值,其中一个也重复了 - 删除了没有“任期日期”的条目。

关于如何在 C# 中执行此操作的任何建议?同样,我正在使用 DataTable 对象。我仍然需要保留“name”和“termdate”字段——如果我没有,那么我可以获得一个不同的(“ID”、“hiredate”)列表,但它们确实需要保留。

谢谢你的帮助!

4

3 回答 3

0

要从数据表中获取不同的值列表...

DataView dv = new DataView(dt);
DataTable dtResults = dv.ToTable(true, "name", "ID", "hiredate");

然后放置学期...

dtResults.Columns.Add("termdate", typeof(DateTime));
foreach (DataRow dr in from x in dt.Rows.Cast<DataRow>() where !x.IsNull("termdate") select x) {
    DataRow drResult = dtResults.Select(string.Format("name=\'{0}\' and ID=\'{1}\' and hiredate=\'{2}\'", dr["name"], dr["ID"], dr["hiredate"])).Single();
    drResult["termdate"] = dr["termdate"];
}
于 2013-10-07T17:35:51.443 回答
0

这是伪代码且未经测试,但这可能会让您入门。

       //Get rows with distinct name, ID hiredate
        DataView dview = new DataView(table);
        DataTable distinctValues = dview.ToTable(true, "name", "ID", "hiredate");

        //Get rows with termdate not null
        DataView tview = new DataView(table, "Isnull(termdate,'') <> ''", "ID", DataViewRowState.CurrentRows);
        DataTable termValues = tview.ToTable(true, "name", "ID", "hiredate", "termdate");

        DataTable result = new DataTable("Table");
        foreach (DataRow r in distinctValues.Rows)
        {
            DataRow[] compare = termValues.Select(string.Format("name='{0}' AND ID='{1}' AND hiredate='{2}'", r["name"], r["ID"], r["hiredate"]));
            //If a value exists with a termdate use it
            if (compare != null && compare.Length > 0)
            {
                DataRow row = result.NewRow();
                row["name"] = compare[0]["name"];
                row["ID"] = compare[0]["ID"];
                row["hiredate"] = compare[0]["hiredate"];
                row["termdate"] = compare[0]["termdate"];
                result.Rows.Add(row);
            }
            // Otherwise use the distinct value
            else
            {
                DataRow row = result.NewRow();
                row["name"] = r["name"];
                row["ID"] = r["ID"];
                row["hiredate"] = r["hiredate"];
                result.Rows.Add(row);
            }
        }
于 2013-10-07T16:40:46.640 回答
0

我可能会做这样的事情, dt 是你原来的数据表 -

这应该涵盖由于数据视图的排序而导致的所有可能性,维护的日期列表允许为用户添加多个雇用日期。

            DataView dv = new DataView(dt);
            dv.Sort = "ID ASC, HireDate DESC, TermDate DESC";

            string lastID = "0";
            List<DateTime> addedHireDatesForUser = new List<DateTime>();

            foreach (DataRowView drv in dv)
            {
                if (drv["ID"].ToString() != lastID)
                {
                    addedHireDatesForUser = new List<DateTime>();
                    addedHireDatesForUser.Add(DateTime.Parse(drv["HireDate"].ToString()));

                    // NEXT ID, ADD ROW TO NEW DATATABLE
                }
                else if (!addedHireDatesForUser.Contains(DateTime.Parse(drv["HireDate"].ToString())))
                {
                    addedHireDatesForUser.Add(DateTime.Parse(drv["HireDate"].ToString());

                    // NEXT DATE, ADD ROW TO NEW DATATABLE
                }

                lastID = drv["ID"].ToString();
            }
于 2013-10-07T16:31:33.037 回答