LINQ 是否有类似 Match 的语法
Is there a Match like syntax for LINQ
这是我试图优雅解决的案例。假设我有一个可枚举对象(它可能是一个相当大的可枚举对象,我宁愿只枚举一次)。还可以说,如果序列中返回的对象符合操作的特定条件,我有我想要 运行 的特定操作。
在函数式语言中,我可以设置一系列匹配项,在找到匹配项时执行。我想要在 C# 中这样的东西。尽可能使用 LINQ。
我最接近的是使用策略模式和一个简单的规则引擎,该引擎按顺序调用每个已注册的策略,直到找到匹配项。有没有更简单的方法?
我想做的是。
myEnum.Match((item)=>item.MatchesCondition, (item)=>ExecuteFunction(item))
.Match((item)=>item.MatchesSomeOtherCondition, (item)=>ExecuteSomeOtherFunction(item));
好吧,您可以使用现有的 LINQ 功能,如下所示:
SomeList.Where(item => item.Equals(item));
如果您不想过滤完全匹配而是过滤 "contains",您可以使用此表达式:
SomeList.Where(item => item.Contains(item));
您可以创建 extension method Match
:
public static class Extensions
{
public static IEnumerable<T> Match<T>(this IEnumerable<T> items, Func<T, bool> condition, Action<T> action)
{
foreach (T item in items)
{
if (condition(item))
{
action(item)
}
else
{
yield return item;
}
}
}
}
这将遍历 items
中的每个项目并且:
- 如果符合条件,则执行
action
- 否则,return 项目通过 iterator
您可以创建一个包含条件和关联操作的字典,使您可以继续循环遍历一系列条件,直到找到匹配项,然后调用关联操作。
void Main()
{
var collection = new List<string> { "One", "Two" };
var dict = new Dictionary<Func<string, bool>, Action<string>>
{
{ ConditionOne, ActionOne },
{ ConditionTwo, ActionTwo },
};
Match(collection, dict);
}
public void Match<T>(IEnumerable<T> collection,
Dictionary<Func<T, bool>, Action<T>> matchMap)
{
var wasMatched = false;
foreach (var item in collection)
{
if (wasMatched) break;
foreach (var pair in matchMap)
{
if (wasMatched) break;
if (pair.Key(item))
{
pair.Value(item);
wasMatched = true;
}
}
}
}
public bool ConditionOne<T>(T item)
{
return false;
}
public void ActionOne<T>(T item)
{
Console.WriteLine(item);
}
public bool ConditionTwo<T>(T item)
{
return true;
}
public void ActionTwo<T>(T item)
{
Console.WriteLine(item);
}
这是我试图优雅解决的案例。假设我有一个可枚举对象(它可能是一个相当大的可枚举对象,我宁愿只枚举一次)。还可以说,如果序列中返回的对象符合操作的特定条件,我有我想要 运行 的特定操作。
在函数式语言中,我可以设置一系列匹配项,在找到匹配项时执行。我想要在 C# 中这样的东西。尽可能使用 LINQ。
我最接近的是使用策略模式和一个简单的规则引擎,该引擎按顺序调用每个已注册的策略,直到找到匹配项。有没有更简单的方法?
我想做的是。
myEnum.Match((item)=>item.MatchesCondition, (item)=>ExecuteFunction(item))
.Match((item)=>item.MatchesSomeOtherCondition, (item)=>ExecuteSomeOtherFunction(item));
好吧,您可以使用现有的 LINQ 功能,如下所示:
SomeList.Where(item => item.Equals(item));
如果您不想过滤完全匹配而是过滤 "contains",您可以使用此表达式:
SomeList.Where(item => item.Contains(item));
您可以创建 extension method Match
:
public static class Extensions
{
public static IEnumerable<T> Match<T>(this IEnumerable<T> items, Func<T, bool> condition, Action<T> action)
{
foreach (T item in items)
{
if (condition(item))
{
action(item)
}
else
{
yield return item;
}
}
}
}
这将遍历 items
中的每个项目并且:
- 如果符合条件,则执行
action
- 否则,return 项目通过 iterator
您可以创建一个包含条件和关联操作的字典,使您可以继续循环遍历一系列条件,直到找到匹配项,然后调用关联操作。
void Main()
{
var collection = new List<string> { "One", "Two" };
var dict = new Dictionary<Func<string, bool>, Action<string>>
{
{ ConditionOne, ActionOne },
{ ConditionTwo, ActionTwo },
};
Match(collection, dict);
}
public void Match<T>(IEnumerable<T> collection,
Dictionary<Func<T, bool>, Action<T>> matchMap)
{
var wasMatched = false;
foreach (var item in collection)
{
if (wasMatched) break;
foreach (var pair in matchMap)
{
if (wasMatched) break;
if (pair.Key(item))
{
pair.Value(item);
wasMatched = true;
}
}
}
}
public bool ConditionOne<T>(T item)
{
return false;
}
public void ActionOne<T>(T item)
{
Console.WriteLine(item);
}
public bool ConditionTwo<T>(T item)
{
return true;
}
public void ActionTwo<T>(T item)
{
Console.WriteLine(item);
}