查找dataset.Table中是否存在值(第0列)。如果是这样,获取行索引并更新值(第1列)

时间:2015-12-13 13:55:41

标签: c# dataset

我真的找不到我的问题的答案,我真的不知道写些什么来找到它。

我得到一个带有布尔值的数字数组。我想检查每个数字是否在我的DataSet中。如果是这样我想检查它的布尔值是否为真,如果值为假,我想更新该值。

 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)”,因为我   接收带加号的数字 - &gt; +34666999333我需要将其删除   将其作为BigInt存储在数据库中

3 个答案:

答案 0 :(得分:1)

也许在这种情况下使用两次Linq调用AsEnumerable而Any并没有比使用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);
    }
}

答案 1 :(得分:1)

不要使用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);
}

答案 2 :(得分:0)

为什么不创建字典?字典在键和数据行的行之间创建链接,而不复制数据表

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);
                }
            }
        }
    }
}

​