查找数据集中是否存在值.表(第0列).如果是,获取行索引并更新(第1列)中的值
本文关键字:索引 获取 更新 1列 集中 存在 数据集 数据 如果 查找 0列 | 更新日期: 2023-09-27 18:26:33
我真的找不到问题的答案,我真的不知道该写些什么来找到它。
我得到一个带有布尔值的数字数组。我想检查每个数字是否都在我的数据集中。如果是这样,我想检查它的布尔值是否为true,如果值为false,我想更新该值。
foreach (var item in EU)
{
if (objDataSet.Tables[0].AsEnumerable().Any(roww => Convert.ToInt64(item.Substring(1, item.Length - 1)) == roww.Field<Int64>(0)))
{
if (objDataSet.Tables[0].AsEnumerable().Any(rowa => true == rowa.Field<bool>(1)))
{
ExistingPhones.Add(item.Substring(1, item.Length - 1), true);
}
else
{
UpdatePhones.Add(item.Substring(1, item.Length - 1), true);
}
}
else
{
ActivePhones.Add(item.Substring(1, item.Length - 1), true);
}
}
我已经解决了所有问题,但第二个If语句非常慢,运行时间呈指数级增长。在第一个if语句中找到数字后,如何直接检查其布尔值?
p.D:不要介意".Substring(1,item.Length-1)",因为我收到带有加号->+34666999333的数字,我需要将其擦除将其作为BigInt 存储到数据库中
在这种情况下,使用两次对AsEnumerable和Any的Linq调用并不比使用DataTable对象的旧Select方法好。在您的代码中,您执行两次上述模式,也许这不是"性能方面的"
您可以使用DataTable.Select方法来避免它,并将结果存储在DataRow数组中。
foreach (var item in EU)
{
string phoneWithoutPlus = item.Substring(1, item.Length - 1);
var rows = objDataSet.Tables[0].Select("Number = " + phoneWithoutPlus);
if (rows.Length > 0 && rows[0].Field<bool>(1) == true)
{
ExistingPhones.Add(phoneWithoutPlus, true);
}
else if (rows.Length > 0 && rows[0].Field<bool>(1) == false)
{
UpdatePhones.Add(phoneWithoutPlus, true);
}
else
{
ActivePhones.Add(phoneWithoutPlus, true);
}
}
不要使用Any(),而是使用FirstOrDefault()获取对象并将其保存到变量中:
var myObj = objDataSet.Tables[0].AsEnumerable()
.Where(roww => Convert.ToInt64(item.Substring(1, item.Length - 1)) == roww.Field<Int64>(0))
.FirstOrDefault();
if (myObj != null)
{
//reuse myObj here
if (myObj...)
{
ExistingPhones.Add(item.Substring(1, item.Length - 1), true);
}
else
{
UpdatePhones.Add(item.Substring(1, item.Length - 1), true);
}
}
else
{
ActivePhones.Add(item.Substring(1, item.Length - 1), true);
}
为什么不创建一个字典呢。字典在键和数据表的行之间创建链接,而不复制数据表
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DataSet objDataSet = new DataSet();
Dictionary<Int64, DataRow> dict = objDataSet.Tables[0].AsEnumerable()
.GroupBy(x => x.Field<Int64>(0), y => y)
.ToDictionary(x => x.Key, y => y.FirstOrDefault());
foreach (var item in EU)
{
Int64 itemKey = Convert.ToInt64(item.Substring(1, item.Length - 1));
if (dict.ContainsKey(itemKey))
{
DataRow row = dict[itemKey];
if (row.Field<bool>(1) == true)
{
ExistingPhones.Add(phoneWithoutPlus, true);
}
else
{
UpdatePhones.Add(phoneWithoutPlus, true);
}
}
else
{
ActivePhones.Add(itemKey, true);
}
}
}
}
}