C# 将静态参数转换为数组并与lambda一起使用,其中

C# 将静态参数转换为数组并与lambda一起使用,其中,c#,C#,编辑:这个问题不是重复的我正在寻找一种方法,在这种方法中,我可以为n个键值参数和相关where子句传递哈希表、数组或一些基于集合的方法。 我有3种重载方法: public static bool DoesRecordExist(string keyColumn, string keyValue, DataTable dt) { if (dt != null && dt.Rows.Count > 0) { bool exists = dt.AsEnumerable().

编辑:这个问题不是重复的我正在寻找一种方法,在这种方法中,我可以为n个键值参数和相关where子句传递哈希表、数组或一些基于集合的方法。

我有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个键/值对。显然,这是愚蠢的

如何将所有这些重载转换为一个函数,在这个函数中,我只需传入一个键值对的
哈希表
(或其他意义相同或更好的集合)


提前感谢。

您可以使用带有
字典的扩展方法来执行此操作
参数:

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;
        }
    }
}
公共静态类扩展
{
公共静态bool DoesRecordExist(此数据表dt、字典键和值)
{
如果(dt!=null&&dt.Rows.Count>0)
{
var rows=dt.AsEnumerable();
foreach(KeysAndValues.Keys中的var键)
{
rows=rows.Where(row=>string.Equals(row[key],key和value[key],StringComparison.CurrentCultureIgnoreCase));
}
返回rows.Any();
}
其他的
{
返回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=newdictionary();
添加(“名字”、“约翰”);
添加(“LastName”、“Doe”);
var dt=…//您的数据表
Console.WriteLine(dt.DoesRecordExist(keysAndValues));
或使用初始值设定项:

var keysAndValues = new Dictionary<string, string>()
{
    { "FirstName", "John"} ,
    { "LastName", "Doe" }
};
var dt = ... // your DataTable
Console.WriteLine(dt.DoesRecordExist(keysAndValues));
var keysAndValues=newdictionary()
{
{“名字”,“约翰”},
{“LastName”,“Doe”}
};
var dt=…//您的数据表
Console.WriteLine(dt.DoesRecordExist(keysAndValues));

最后,您可能需要使用
row[key].ToString()
row[key]作为字符串
,而不仅仅是
row[key]

@Servy,这不是重复的。
dt.AsEnumerable().Any(r=>kvps.All(kvp=>r[kvp.key].Equals(kvp.Value))?Kvps只是KeyValuePair的一个ienumerable,这个逻辑询问“是否有任何一行,其中一组列c中的所有条目都有相应的值vmigh希望将您的安全修剪也粘贴在其中,但我不确定这对int有何意义。”。。