从DataTable中选择两列之间的记录
本文关键字:两列 之间 记录 DataTable 选择 | 更新日期: 2024-10-24 13:38:14
我在谷歌上搜索过,但没有找到任何解决方案。请大家帮帮我。
问题:
我在Datatable
中有三列:ID
、Value1
和Value2
。
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
}
那么,我该如何编写代码来完成我上面解释的任务呢?
只需将==
替换为>=
和<=
:
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 <= v1
和row.Value2 > v1
或row.Value1 < v2
和row.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();