3
IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                              select myRow;

IEnumerable<DataRow> rows;

rows = from myRow in mergedRows where  
double.Parse(myRow["signalName"].ToString())> 1800 &&
                                       select myRow;

mergedRows = rows;
IEnumerable<DataRow> rows;//reinitializing 
rows = from myRow in mergedRows where
double.Parse(myRow["signalName"].ToString()) < 2400
                                       select myRow;

上面一个给我零结果,这是错误的..当查询第二次运行时,mergedRows 在第一个条件之后具有结果数据。在第二次查询执行后我仍然没有得到结果。

但是具有组合条件的相同查询可以正常工作。

IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                              select myRow;
IEnumerable<DataRow> rows;

rows = from myRow in mergedRows  where 
double.Parse(myRow[signalName].ToString()) > 1800 &&
double.Parse(myRow[signalName].ToString()) < 2400
                                       select myRow;

这给了我正确的准确结果。

你能解释一下为什么..

4

1 回答 1

1

我认为您可能遇到了“延迟执行”问题。

这包含您的“源”数据

 IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                          select myRow;

这包含您的查询,但尚未实际执行。

IEnumerable<DataRow> rows = from myRow in mergedRows where  
                            double.Parse(myRow["signalName"].ToString())> 1800 
                            select myRow;

然后这会用未执行的查询覆盖您的源数据

mergedRows = rows;

您可以尝试通过将查询包装在 .ToList(); 中来贪婪地执行查询。

IEnumerable<DataRow> mergedRows = from myRow in _gridData.AsEnumerable()
                                              select myRow;

var rows = (from myRow in mergedRows where  
            double.Parse(myRow["signalName"].ToString())> 1800 &&
            select myRow).ToList();

mergedRows = rows;


rows = (from myRow in mergedRows where
        double.Parse(myRow["signalName"].ToString()) < 2400
        select myRow).ToList();

如果您总是要执行这两个过滤器,我会考虑只清理整个事情并将所有工作合并到一个查询中。

private double SafeParse(string s)
{
    double d;
    return double.TryParse(s, out d) ? d : 0; //return zero if the value is unparsable
}


var results = (from myRow in _gridData.AsEnumerable()
              let d = SafeParse(myRow[signalName].ToString()) 
              where d > 1800 && d < 2400
              select myRow).ToList();
于 2013-05-23T08:44:10.423 回答