编辑:此问题不是Converting a datetime object to an integer python的重复。 我正在寻找一种方法,可以为n个键值参数和相关的where子句传递Hashtable,数组或某些基于集合的方法。
我有3种重载方法:
public static bool DoesRecordExist(string keyColumn, string keyValue, DataTable dt) {
if (dt != null && dt.Rows.Count > 0) {
bool exists = dt.AsEnumerable().Where(r => string.Equals(SafeTrim(r[keyColumn]), keyValue, StringComparison.CurrentCultureIgnoreCase)).Any();
return exists;
} else {
return false;
}
}
public static bool DoesRecordExist(string keyColumn1, string keyColumn2, string keyValue1, string keyValue2, DataTable dt) {
if (dt != null && dt.Rows.Count > 0) {
bool exists = dt.AsEnumerable().Where(r => string.Equals(SafeTrim(r[keyColumn1]), keyValue1, StringComparison.CurrentCultureIgnoreCase) && string.Equals(SafeTrim(r[keyColumn2]), keyValue2, StringComparison.CurrentCultureIgnoreCase)).Any();
return exists;
} else {
return false;
}
}
public static bool DoesRecordExist(string keyColumn1, string keyColumn2, string keyColumn3, string keyValue1, string keyValue2, string keyValue3, DataTable dt) {
if (dt != null && dt.Rows.Count > 0) {
bool exists = dt.AsEnumerable().Where(r => string.Equals(SafeTrim(r[keyColumn1]), keyValue1, StringComparison.CurrentCultureIgnoreCase) && string.Equals(SafeTrim(r[keyColumn2]), keyValue2, StringComparison.CurrentCultureIgnoreCase) && string.Equals(SafeTrim(r[keyColumn3]), keyValue3, StringComparison.CurrentCultureIgnoreCase)).Any();
return exists;
} else {
return false;
}
}
所有这些都按预期工作,并且您可以看到,所有3个都是相同的,只是参数的数量和相应的where
子句参数不断增加。现在,我需要添加具有5个键/值对的另一个重载。显然,这越来越傻了。
如何将所有这些重载转换为一个函数,只需在其中传递Hashtable
的键值对(或其他具有同等或更好意义的集合)?
谢谢。
答案 0 :(得分:-1)
您可以使用带有Dictionary<string, string>
参数的扩展方法来做到这一点:
public static class Extensions
{
public static bool DoesRecordExist(this DataTable dt, Dictionary<string, string> KeysAndValues)
{
if (dt != null && dt.Rows.Count > 0)
{
var rows = dt.AsEnumerable();
foreach (var key in KeysAndValues.Keys)
{
rows = rows.Where(row => string.Equals(row[key], KeysAndValues[key], StringComparison.CurrentCultureIgnoreCase));
}
return rows.Any();
}
else
{
return false;
}
}
}
然后您可以像这样使用:
var keysAndValues = new Dictionary<string, string>();
keysAndValues.Add("FirstName", "John");
keysAndValues.Add("LastName", "Doe");
var dt = ... // your DataTable
Console.WriteLine(dt.DoesRecordExist(keysAndValues));
或带有初始化程序:
var keysAndValues = new Dictionary<string, string>()
{
{ "FirstName", "John"} ,
{ "LastName", "Doe" }
};
var dt = ... // your DataTable
Console.WriteLine(dt.DoesRecordExist(keysAndValues));
最后,您可能需要使用row[key].ToString()
或row[key] as string
而不是row[key]
。