如何在数据表中搜索特定值?

时间:2014-07-08 16:52:42

标签: c# asp.net datatable

伙计我在ASP webforms应用程序中有一个datatable,我正在尝试实现一种排序。基本上我有两个名为Agent_Name&的字段。我的数据表中Agent_Code

例如datatable的值如下:

+------------+------------+
| Agent_Code | Agent_Name |
+------------+------------+
|          1 | A          |
|          2 | B          |
|          3 | C          |
|          4 | D          |
|          5 | E          |
+------------+------------+

现在我有另一个Agent_Code数组,其中我2,3,5现在我要将此数组与datatable进行比较,并且仅将这些数据保存在datatable中其中Agent_Code = 2,3,5并弃掉其余部分。因此,最终的datatable将如下所示:

+------------+------------+
| Agent_Code | Agent_Name |
+------------+------------+
|          2 | B          |
|          3 | C          |
|          5 | E          |
+------------+------------+

我应该如何做到这一点?我会很感激一些指示。

注意:请使用linq之外的其他内容,我正在使用webforms。

4 个答案:

答案 0 :(得分:2)

您可以使用嵌套for循环:

for (int y = OriginalDataTable.Rows.Count - 1; y >= 0; y--)
{
    int count = 0;
    for (int i = 0; i <= AgentCodeArray.Length - 1; i++)
    {
        if (OriginalDataTable.Rows[y]["Agent_Code"].ToString() != AgentCodeArray[i].ToString())
        {
            count++;
            if (count == AgentCodeArray.Length)
                OriginalDataTable.Rows[y].Delete();
        }
    }
}

这样做是通过数据表中的每条记录检查“Agent_Code”是否包含在新数组中的任何位置。如果是这样,那就试试吧。如果没有,请将其删除。

此处的关键是在删除时通过数据表向后移动。如果不这样做,索引将被重新排序,您将看到错误。

答案 1 :(得分:1)

试试这个:

//creating some test datatable and agent list
DataTable table = new DataTable();

table.Columns.Add(new DataColumn("Agent_Code"));
table.Columns.Add(new DataColumn("Agent_Name"));

DataRow row1 = table.NewRow();
DataRow row2 = table.NewRow();
DataRow row3 = table.NewRow();
DataRow row4 = table.NewRow();
DataRow row5 = table.NewRow();

row1["Agent_Code"] = 1;
row2["Agent_Code"] = 2;
row3["Agent_Code"] = 3;
row4["Agent_Code"] = 4;
row5["Agent_Code"] = 5;

row1["Agent_Name"] = "A";
row2["Agent_Name"] = "B";
row3["Agent_Name"] = "C";
row4["Agent_Name"] = "D";
row5["Agent_Name"] = "E";

table.Rows.Add(row1);
table.Rows.Add(row2);
table.Rows.Add(row3);
table.Rows.Add(row4);
table.Rows.Add(row5);

string[] Agent_Code = new string[] { "1", "3" };

//finished test data

//actual logic here
StringBuilder filterBuilder = new StringBuilder();

for (int i = 0; i < Agent_Code.Length; i++)
{
     if (i != 0) filterBuilder.Append(" OR ");

     filterBuilder.Append("Agent_Code = '");
     filterBuilder.Append(Agent_Code[i]);
     filterBuilder.Append("'");
}

DataView view = new DataView(table, filterBuilder.ToString(), "Agent_Code", DataViewRowState.CurrentRows);

DataTable newTable = view.ToTable();

答案 2 :(得分:0)

以下代码可以帮助您

string[] single = new string[2] { "2", "3" };
var arr = dt.Rows.Cast<DataRow>().Where(r => single.Contains(r.Field<string>
                                     ("Agent_Code"))).CopyToDataTable();

在这个示例中,dt是从gridview.datasource获取的数据源,single是您的Agent_Code的数组。

答案 3 :(得分:0)

除了使用Pragnesh提供的LINQ之外,您还可以考虑创建一个DataView。

使用您拥有的数组数据,使用RowFilter属性循环包含DataTable中原始集的DataView,以删除与数组中的那些条目不匹配的DataTable条目。

对DataView中的过滤结果进行排序,您就拥有了已过滤和排序的集合。