【问题标题】:My linq query is not working as expected, what im i doing wrong?我的 linq 查询没有按预期工作,我做错了什么?
【发布时间】:2019-11-09 13:04:24
【问题描述】:

我有一个我在读取 txt 文件后创建的数据表,一旦我有了那个数据表,我需要根据 1 列和一个值列表删除行列表 returnClass(),但经过一些测试,我发现我的LINQ 删除的内容超出了预期......所以不确定我在下面的代码中做错了什么。

起初我认为一切都很好,因为我正在处理大量记录并且每次通过时数字都在下降,但现在我使用一个小文件进行调试,我发现它删除了更多比它应该的..

这是我的 LINQ 查询:

// REMOVES ALL RECORDS WITH A CLASS THAT IS NON-LABEL CLASS                    
var query = from r in d.AsEnumerable()
            where !returnClass().Any(r.Field<string>("Column7").Contains)
            select r;

DataTable output = query.CopyToDataTable<DataRow>();
int dtoutputCount = output.Rows.Count;

ToCSV(output, ftype, "filteredclass");

这是我的清单:(缩短以使这个问题变得简单)

private List<string> returnClass()
{
    List<string> cl = new List<string>();
    cl.Add("7");
    cl.Add("72");
    return cl;
}

我的数据表有 100 行,column7 中有数字,输入字符串,我需要在我的列表中找到具有确切数字的每一行,所以如果它找到一个 7,我不想要它,如果它找到一个72 我不想要它。但是,如果有 75、17 或 127,则需要留下。上面的查询正在删除那些,因为它包含数字 7。

如何根据完全匹配删除?

【问题讨论】:

  • 使用Equals 代替Contains?
  • 一个有用的信息可能是包括您的示例输入、预期输出和实际输出。
  • 使用Contains 代替Any?
  • 如果您在List&lt;string&gt; cl = new List&lt;string&gt;(); 上设置断点,该行多久执行一次?一次,还是多次?我担心它可能会针对d 中的每一行执行。

标签: c# list linq datatable


【解决方案1】:

我认为问题在于您实际上是在查看returnClass() 列表中的任何值是否包含在column7 中找到的值。在您的 Any 函数中,您正在使用 String.Contains,我猜您希望这是 List.Contains 或类似的东西。

试试这个(未经测试):

// REMOVES ALL RECORDS WITH A CLASS THAT IS NON-LABEL CLASS                    
var query = from r in d.AsEnumerable()
            where !returnClass().Contains(r.Field<string>("Column7"))
            select r;

DataTable output = query.CopyToDataTable<DataRow>();
int dtoutputCount = output.Rows.Count;

ToCSV(output, ftype, "filteredclass");

【讨论】:

  • 看起来这行得通,现在正在测试,如果有任何问题会报告,但我已经将你的问题标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多