从DataTable中选择两列之间的记录

本文关键字:两列 之间 记录 DataTable 选择 | 更新日期: 2024-10-24 13:38:14

我在谷歌上搜索过,但没有找到任何解决方案。请大家帮帮我。

问题:

我在Datatable中有三列:IDValue1Value2

DataTable看起来像这样:

ID   Value1   Value2
1      10       20
2      15       30 

我想找到一定范围内的数据。让我通过展示一个例子来澄清:

如果我输入值15到30,它不应该允许,因为15已经存在于10到20之间。

这是我写的代码,如果我再次输入相同的值,我会得到消息:

bool inRange = dtCurrentTable.AsEnumerable()
    .Any(row => Convert.ToInt32(drCurrentRow["Value1"]) == row.Field<Int32>("Value1")
             && Convert.ToInt32(drCurrentRow["Value2"]) == row.Field<Int32>("Value2"));
if (inRange)
{
    //msg
}

那么,我该如何编写代码来完成我上面解释的任务呢?

从DataTable中选择两列之间的记录

只需将==替换为>=<=:

if (dtCurrentTable.AsEnumerable().Any(row =>
      (
      Convert.ToInt32(drCurrentRow["Value1"]) <= row.Field<Int32>("Value1") && 
      Convert.ToInt32(drCurrentRow["Value2"]) >= row.Field<Int32>("Value1")
      ) 
      ||
      ( 
      Convert.ToInt32(drCurrentRow["Value1"]) <= row.Field<Int32>("Value2") && 
      Convert.ToInt32(drCurrentRow["Value2"]) >= row.Field<Int32>("Value2")
      ) 
   )
  {
   //  value1 or value2 falls within an already existing range 
  }

您最好使用一个简单的循环来检查给定的值是否显示在现有行中。它有点像;

foreach (DataRow row in dt.Rows)
        {
            int val1 = Convert.ToInt32(row["Value1"]);
            int val2 = Convert.ToInt32(row["Value2"]);
            if (someValue>=val1 && someValue<=val2)
            {
                // do not insert
            }
        }

因此,您有一个具有两个值v1和v2的DataRow,并且您想查看DataTable是否已经包含其中row.Value1 <= v1row.Value2 > v1row.Value1 < v2row.Value2 >= v2

int v1 = row.Field<int>("Value1");
int v2 = row.Field<int>("Value2");
var inRangeRows = from r in dtCurrentTable.AsEnumerable() 
                  where (r.Field<Int32>("Value1") <= v1 && r.Field<Int32>("Value2") >  v1)
                     || (r.Field<Int32>("Value1") <  v2 && r.Field<Int32>("Value2") >= v2)
                  select r;
bool inRange = inRangeRows.Any();