有一项要求。我有一个excel导入功能,可以从excel文件向数据库添加数据。我需要在导入之前添加一个过滤器来检查数据。假设有一个像 3:44-5:87-1:345 这样的值。 在导入之前,我需要验证这些数据是否有效 -
- > 3,5,1应存在于表T1
中- > 44,87,345,应存在于表T2中。
如果两个条件匹配数据都应该验证为正确
目前的代码就像
string test = "3:44-5:87-1:345";
var attributes = test.Split(new[] { "-" },
StringSplitOptions.RemoveEmptyEntries);
if (attributes.Length != 0)
{
foreach (var attribute in attributes)
{
var attArray = attribute.Split(new[] { ":" },
StringSplitOptions.RemoveEmptyEntries);
if (attArray.Length >= 2)
{
int key = Convert.ToInt32(attArray[0].ToString())
int value = Convert.ToInt32(attArray[1].ToString())
//Call db to check if key exist
if(KeyExist)
{
//Call db to check if value exist for the key
if(ValueExist)
{
//CODE here to import data to datatabse
}
}
}
}
}
对于上面的样本数据,它将调用3个Key(3,5,1)和3个3值调用(44,47,345)。因此,如果excel表中有100行,我可能会在数千个DB调用中结束。 如何优化它?
答案 0 :(得分:0)
如果在Excel工作表中多次出现键和值,则可以使用词典加快逻辑运算:
Dictionary<int, bool> keys = new Dictionary<int,bool>();
Dictionary<int, bool> values = new Dictionary<int,bool>();
string test = "3:44-5:87-1:345";
var attributes = test.Split(new[] { "-" },
StringSplitOptions.RemoveEmptyEntries);
if (attributes.Length != 0)
{
foreach (var attribute in attributes)
{
var attArray = attribute.Split(new[] { ":" },
StringSplitOptions.RemoveEmptyEntries);
if (attArray.Length >= 2)
{
int key = Convert.ToInt32(attArray[0].ToString())
int value = Convert.ToInt32(attArray[1].ToString())
if(!keys.Contains(key))
{
keys.Add(key, keyExists(key));
}
if(!values.Contains(value))
{
values.Add(value, valueExists(value));
}
if(keys[key])
{
if(values[value])
{
//CODE here to import data to datatabse
}
}
}
}
}
如果你的输入字符串是:
string test = "3:44-5:87-1:345-3:87-5:345-1:44";
与原始方法相比,使用字典的方法会将数据库查找减少一半。