-2

编辑:这个问题不是Check if any item in a list match any item in another list的重复。我正在寻找一种方法,在这种方法中,我可以为 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键值对(或其他一些具有相同或更有意义的集合)?

提前致谢。

4

1 回答 1

-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()orrow[key] as string而不是row[key].

于 2019-01-05T10:49:20.213 回答