使用 LINQ 的魔力 - 如何为每个匹配的条件调用委托?

发布于 2024-08-16 19:17:32 字数 290 浏览 2 评论 0原文

我想做这样的事情:

List<string> list = new List<string>();
... put some data in it ...

list.CallActionForEachMatch(x=>x.StartsWith("a"), ()=> Console.WriteLine(x + " matches!"););

Syntax: CallActionForEachMatch(Criteria, Action)

这怎么可能? :)

I wanna do something like this:

List<string> list = new List<string>();
... put some data in it ...

list.CallActionForEachMatch(x=>x.StartsWith("a"), ()=> Console.WriteLine(x + " matches!"););

Syntax: CallActionForEachMatch(Criteria, Action)

How is this possible? :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

零時差 2024-08-23 19:17:32

我不会;我只会使用:

foreach(var item in list.Where(x=>x.StartsWith("a"))) {
    Console.WriteLine(item + " matches!");
}

但你可以使用:

list.FindAll(x=>x.StartsWith("a"))
    .ForEach(item=>Console.WriteLine(item + " matches!"));

I wouldn't; I'd just use:

foreach(var item in list.Where(x=>x.StartsWith("a"))) {
    Console.WriteLine(item + " matches!");
}

But you could use:

list.FindAll(x=>x.StartsWith("a"))
    .ForEach(item=>Console.WriteLine(item + " matches!"));
゛时过境迁 2024-08-23 19:17:32
list.FindAll(x=>x.StartsWith("a"))
    .ForEach(x =>  Console.WriteLine(x + " matches!"));

或者您可以编写自己的 CallActionForEachMatch 扩展:

public static void CallActionForEachMatch<T>(this IEnumerable<T> values, Func<T, bool> pred, Action<T> act)
{
    foreach (var value in values.Where(pred))
    {
        act(value);
    }
}
list.FindAll(x=>x.StartsWith("a"))
    .ForEach(x =>  Console.WriteLine(x + " matches!"));

Or you can write your own CallActionForEachMatch extension:

public static void CallActionForEachMatch<T>(this IEnumerable<T> values, Func<T, bool> pred, Action<T> act)
{
    foreach (var value in values.Where(pred))
    {
        act(value);
    }
}
千寻… 2024-08-23 19:17:32

编写扩展方法:

static class IEnumerableForEachExtensions {
    public static void ForEachMatch<T>(this IEnumerable<T> items,
        Predicate<T> predicate,
        Action<T> action
    ) {
        items.Where(x => predicate(x)).ForEach(action);
    }

    public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) {
        foreach(T item in items) {
            action(item);
        }
    }
 }

用法:

// list is List<string>
list.ForEachMatch(s => s.StartsWith("a"), s => Console.WriteLine(s));

请注意,这是完全通用的,因为它会吃掉任何 IEnumerable。请注意,由于明显的副作用,有些人会认为这是对 LINQ 的滥用。

Write extension methods:

static class IEnumerableForEachExtensions {
    public static void ForEachMatch<T>(this IEnumerable<T> items,
        Predicate<T> predicate,
        Action<T> action
    ) {
        items.Where(x => predicate(x)).ForEach(action);
    }

    public static void ForEach<T>(this IEnumerable<T> items, Action<T> action) {
        foreach(T item in items) {
            action(item);
        }
    }
 }

Usage:

// list is List<string>
list.ForEachMatch(s => s.StartsWith("a"), s => Console.WriteLine(s));

Note this is fully general as it will eat any IEnumerable<T>. Note that there are some that would consider this an abuse of LINQ because of the explicit side effects.

幸福不弃 2024-08-23 19:17:32

像这样的扩展方法:

static public void CallActionForEachMatch(this List<T> list, Func<T, bool> criteria, Action<T> action)
{
    list.Where(criteria).ToList().ForEach(action);
}

An extension method something like this:

static public void CallActionForEachMatch(this List<T> list, Func<T, bool> criteria, Action<T> action)
{
    list.Where(criteria).ToList().ForEach(action);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文