奇怪的问题

时间:2009-07-03 12:35:41

标签: c# asp.net

假设我有一个DataTable:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Country", typeof(string)));
dt.Columns.Add(new DataColumn("State", typeof(string)));

现在我填充它

DataRow dn = dt.NewRow();
dn["Country"] = "1";
dn["State"] == "2";

// Add it
dt.Rows.Add(dn);

工作正常。现在,如果Country和State为零,我不希望它添加到表中。例如:

dn["Country"] = "0";
dn["State"] = "0";

if (dn["Country"].ToString() != "0" &&
    dn["State"].ToString() != "0")
   dt.Rows.Add(dn);

这不起作用。我在那里做错了什么?我已经尝试将类型设置为int,这也无济于事......

谢谢, 吉姆

更新

这更像我正在做的事情:

dn["Country"] = (from c in db.Country where c.Zone == 3 select c.Code).Count();

现在,如果要返回Zero,则不应将该行添加到DataTable中。相反的是,如果计数大于0,则不会添加。

更新2

现在可以使用Any(),正如下面Jon Skeet所建议的那样。谢谢大家!

3 个答案:

答案 0 :(得分:2)

通过“那不起作用”你的意思是行还是被添加了吗?这听起来很奇怪 - 你有一个简短而完整的程序来证明这个问题吗?

这是 工作的简短但完整的程序:

using System;
using System.Data;

class Test
{
    static void Main()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("Country", typeof(string)));
        dt.Columns.Add(new DataColumn("State", typeof(string)));

        DataRow dn = dt.NewRow();
        dn["Country"] = "0";
        dn["State"] = "0";

        if (dn["Country"].ToString() != "0" &&
            dn["State"].ToString() != "0")
        {
            Console.WriteLine("Broken");
            dt.Rows.Add(dn);
        }
        else
        {
            Console.WriteLine("Working");
        }
    }
}

很难准确地根据片段确定您正在做什么,但是您可能正在更改DataTable已经的行的值,而不是一个尚未添加的?

编辑:这是一个非常奇怪的代码行:

dn["Country"] = (from c in db.Country where c.Zone == 3 select c.Code).Count();

为什么要将国家设置为计数?此外,如果您只关心计数,为什么还要为投影而烦恼?

最后,我可能只是使用一个局部变量而不是将其放在数据行开头:

int count = db.Country.Where(c => c.Zone == 3).Count();
if (count != 0)
{
    // Use count, add the row etc
}

哦,如果你真的不需要计数,但只需知道它是否为非零,请使用Any

if (db.Country.Any(c => c.Zone == 3))
{
    // ...
}

答案 1 :(得分:1)

您的填充代码错误,我不知道这是一个拼写错误还是直接来自您的来源。

你写了

//the "==" won't assign anything to the dn["State"] column
dn["State"] == "2"; 

你真正需要的地方

//the "=" will
dn["State"] = "2";

因为State列永远不会被填充,所以if条件将不起作用。

if (dn["Country"].ToString() != "0" 
 && dn["State"].ToString() != "0") 
//this will always be false because dn["State"] was never assigned to

另一点是,如果列未指定值,则该值将为DBNull。您可能应该修改检查以查看值是否为DBNull,您可以使用IsNull方法执行此操作。

我希望这会有所帮助: - )

答案 2 :(得分:-1)

问题是您要为DataRow分配int(将object装箱):

dn["Country"] = (from c in db.Country where c.Zone == 3 select c.Code).Count();

然后将其与string进行比较:

if (dn["Country"].ToString() != "0"

尝试将Count()更改为Count().ToString(),问题可能会得到解决。