gpt4 book ai didi

c# - 在 C# 中使用 LINQ 过滤可变数量的参数

转载 作者:行者123 更新时间:2023-11-30 18:26:17 26 4
gpt4 key购买 nike

我有一个带有一个 DataTableDataSet,现在我想要一种通用方法来检查不同的 LINQ 查询是否返回任何匹配项。

例如。假设我有一个名为 MyTable 的表,其中包含以下数据。

Col1   Col2   Col3   Col4

A1 B1 C1 D1

A2 B2 C2 D2

A3 B3 C3 D3

我现在想要一个函数 Conflicting ,我可以用任意数量的代表列和值的参数来调用它。 Conflicting 如果所有参数都匹配任何行,则应返回 true。

Conflicting(MyTable, (Col1,A1)) //returns True
Conflicting(MyTable, (Col1,A1), (Col2,B1),(Col3,C1), (Col4,D1)) //returns True
Conflicting(MyTable, (Col1,A1), (Col2,D1)) //returns False

这就是我现在的代码,问题是该代码仅适用于检查是否存在将一列设置为特定值的行。

public static bool Conflicting(string table, string colum, string value)
{
DataTable dt = state.Tables[table];

var lines =
from s in dt.AsEnumerable()
where s.Field<string>(parameter) == value
select new
{
ID = s.Field<Int32>(table + "ID")
};

var count = lines.Count();

return count > 0;
}

最佳答案

如果在任何行中找到任何输入,或者如果它们所有 必须在某行中找到。

前者更简单,下面是一个例子:

static bool Conflicting(string table, params Tuple<string, string>[] columnValuePairs)
{
DataTable dt = state.Tables[table];

return dt.AsEnumerable().Any(
row => columnValuePairs.Any(p => row.Field<string>(p.Item1) == p.Item2));
}

你可以像这样调用上面的内容:

Conflicting("MyTable",
Tuple.Create("Col1", "A1"),
Tuple.Create("Col2", "B1"),
Tuple.Create("Col3", "C1"),
Tuple.Create("Col4", "D1"));


如果以上不是您实际寻找的标准,请编辑您的问题,以便清楚您需要什么标准。要非常具体,并记住一组示例不会唯一地定义某些标准。如果您不确定我的意思,请阅读 https://stackoverflow.com/help/how-to-ask有关更具体的提示。


编辑:

根据您更新的问题,您在其中表明您想要后一种行为,即给定列/值对的每个必须在一些行中找到,以下应该可以代替:

static bool Conflicting(string table, params Tuple<string, string>[] columnValuePairs)
{
DataTable dt = state.Tables[table];
var remainingPairs = new List<Tuple<string, string>>(columnValuePairs);

foreach (var row in dt.AsEnumerable())
{
int i = 0;

while (i < remainingPairs.Count)
{
Tuple<string, string> columnValuePair = remainingPairs[i];

if (row.Field<string>(columnValuePair.Item1) == columnValuePair.Item2)
{
remainingPairs.RemoveAt(i);
continue;
}

i++:
}

if (remainingPairs.Count == 0)
{
return true;
}
}

return false;
}

上面检查每一行以找到该行的任何匹配列/值对,从对列表中删除该对以查找它是否匹配。如果要查找的列/值对列表变为空时,该方法返回 true,已找到所有请求的对。如果在没有清空列表的情况下枚举了表中的所有行,则某些对不匹配任何行,并且该方法返回 false

请注意,以上并不是实现此目的的唯一方法。实际上,如果您希望有大量的列/值对,为了提高性能,您可能需要一些不同的东西,例如使用哈希集或字典(可以使用其中任何一种,但它们各有优缺点缺点)。但是对于数量相对较少(最多说几十个)的列/值对,一个列表就足够了,而且它确实使实现变得简单。

关于c# - 在 C# 中使用 LINQ 过滤可变数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28853793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com