查找数据集中是否存在值.表(第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 存储到数据库中

查找数据集中是否存在值.表(第0列).如果是,获取行索引并更新(第1列)中的值

在这种情况下,使用两次对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);
                }
            }
        }
    }
}
​