委托高阶应用

委托高阶应用

 

FuncPredicate 是 C# 中非常强大的工具,它们不仅可以简化代码,还能让代码更具表达力和灵活性。在掌握了它们的基础用法后,我们可以进一步探索它们的高阶应用场景,尤其是在复杂的逻辑处理、数据操作和设计模式中的应用。

以下是一些 FuncPredicate 的高阶应用场景和技巧:


1. 高阶应用场景

1.1 动态逻辑处理

FuncPredicate 可以用于动态定义逻辑,尤其是在运行时需要根据条件改变行为的情况下。

示例:动态筛选条件

假设我们有一个玩家列表,需要根据不同的条件动态筛选玩家。

 
 
 
xxxxxxxxxx
 
 
 
 
using System;
using System.Collections.Generic;
using System.Linq;

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
    public bool IsActive { get; set; }
}

public class Program
{
    public static void Main()
    {
        List<Player> players = new List<Player>
        {
            new Player { Name = "Alice", Score = 100, IsActive = true },
            new Player { Name = "Bob", Score = 200, IsActive = false },
            new Player { Name = "Charlie", Score = 150, IsActive = true }
        };

        // 动态定义筛选条件
        Predicate<Player> filterByScore = player => player.Score > 120;
        Predicate<Player> filterByActive = player => player.IsActive;

        // 组合筛选条件
        var filteredPlayers = players.Where(player => filterByScore(player) && filterByActive(player)).ToList();

        foreach (var player in filteredPlayers)
        {
            Console.WriteLine($"Name: {player.Name}, Score: {player.Score}, Active: {player.IsActive}");
        }
    }
}
 

1.2 策略模式(Strategy Pattern)

Func 可以用于实现策略模式,允许在运行时动态选择算法或行为。

示例:动态选择计算方法

假设我们需要根据不同的策略计算玩家的得分。

 
 
 
xxxxxxxxxx
 
 
 
 
using System;

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
}

public class ScoreCalculator
{
    public static int CalculateBonus(Player player, Func<Player, int> strategy)
    {
        return strategy(player);
    }
}

public class Program
{
    public static void Main()
    {
        Player player = new Player { Name = "Alice", Score = 100 };

        // 定义不同的计算策略
        Func<Player, int> bonusStrategy1 = p => p.Score + 50;
        Func<Player, int> bonusStrategy2 = p => p.Score * 2;

        // 动态选择策略
        int bonus1 = ScoreCalculator.CalculateBonus(player, bonusStrategy1);
        int bonus2 = ScoreCalculator.CalculateBonus(player, bonusStrategy2);

        Console.WriteLine($"Bonus 1: {bonus1}");
        Console.WriteLine($"Bonus 2: {bonus2}");
    }
}
 

1.3 数据转换与映射

Func 可以用于将一种数据类型转换为另一种数据类型,尤其是在处理集合数据时非常有用。

示例:将玩家列表映射为名字列表

 
 
 
xxxxxxxxxx
 
 
 
 
using System;
using System.Collections.Generic;
using System.Linq;

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
}

public class Program
{
    public static void Main()
    {
        List<Player> players = new List<Player>
        {
            new Player { Name = "Alice", Score = 100 },
            new Player { Name = "Bob", Score = 200 },
            new Player { Name = "Charlie", Score = 150 }
        };

        // 使用 Func 将玩家列表映射为名字列表
        Func<Player, string> nameSelector = player => player.Name;
        var names = players.Select(nameSelector).ToList();

        foreach (var name in names)
        {
            Console.WriteLine(name);
        }
    }
}
 

1.4 延迟执行与惰性求值

Func 可以用于延迟执行某些操作,直到真正需要结果时才进行计算。

示例:延迟计算玩家得分

 
 
 
xxxxxxxxxx
 
 
 
 
using System;

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
}

public class Program
{
    public static void Main()
    {
        Player player = new Player { Name = "Alice", Score = 100 };

        // 延迟计算得分
        Func<int> delayedCalculation = () => player.Score + 50;

        // 只有在调用时才会计算结果
        Console.WriteLine("Delayed Calculation: " + delayedCalculation());
    }
}
 

2. 高阶技巧

2.1 组合委托

你可以将多个 FuncPredicate 组合在一起,形成更复杂的逻辑。

示例:组合多个 Predicate

 
 
 
xxxxxxxxxx
 
 
 
 
using System;
using System.Collections.Generic;
using System.Linq;

public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
    public bool IsActive { get; set; }
}

public class Program
{
    public static void Main()
    {
        List<Player> players = new List<Player>
        {
            new Player { Name = "Alice", Score = 100, IsActive = true },
            new Player { Name = "Bob", Score = 200, IsActive = false },
            new Player { Name = "Charlie", Score = 150, IsActive = true }
        };

        // 定义多个 Predicate
        Predicate<Player> filterByScore = player => player.Score > 120;
        Predicate<Player> filterByActive = player => player.IsActive;

        // 组合 Predicate
        Predicate<Player> combinedFilter = player => filterByScore(player) && filterByActive(player);

        var filteredPlayers = players.FindAll(combinedFilter);

        foreach (var player in filteredPlayers)
        {
            Console.WriteLine($"Name: {player.Name}, Score: {player.Score}, Active: {player.IsActive}");
        }
    }
}
 

2.2 柯里化(Currying)

柯里化是一种将多参数函数转换为一系列单参数函数的技术。Func 可以很好地支持柯里化。

示例:柯里化函数

 
 
 
xxxxxxxxxx
 
 
 
 
using System;

public class Program
{
    public static void Main()
    {
        // 定义一个多参数函数
        Func<int, int, int, int> addThreeNumbers = (a, b, c) => a + b + c;

        // 柯里化
        Func<int, Func<int, Func<int, int>>> curriedAdd = a => b => c => a + b + c;

        // 使用柯里化函数
        var result = curriedAdd(1)(2)(3);
        Console.WriteLine("Curried Result: " + result);
    }
}
 

2.3 部分应用(Partial Application)

部分应用是指固定一个函数的部分参数,生成一个新的函数。

示例:部分应用

 
 
 
xxxxxxxxxx
 
 
 
 
using System;

public class Program
{
    public static void Main()
    {
        // 定义一个多参数函数
        Func<int, int, int, int> addThreeNumbers = (a, b, c) => a + b + c;

        // 部分应用:固定第一个参数
        Func<int, int, int> addTwoNumbers = addThreeNumbers(1);

        // 使用部分应用函数
        var result = addTwoNumbers(2, 3);
        Console.WriteLine("Partial Application Result: " + result);
    }
}
 

 

posted @   世纪末の魔术师  阅读(6)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
  1. 1 ありがとう··· KOKIA
ありがとう··· - KOKIA
00:00 / 00:00
An audio error has occurred.

作词 : KOKIA

作曲 : KOKIA

编曲 : 日向敏文

作词 : KOKIA

作曲 : KOKIA

誰もが気付かぬうちに

誰もが気付かぬうちに

何かを失っている

フッと気付けばあなたはいない

思い出だけを残して

せわしい時の中

言葉を失った人形達のように

街角に溢れたノラネコのように

声にならない叫びが聞こえてくる

もしも もう一度あなたに会えるなら

もしも もう一度あなたに会えるなら

たった一言伝えたい

ありがとう

ありがとう

時には傷つけあっても

時には傷つけあっても

あなたを感じていたい

思い出はせめてもの慰め

いつまでもあなたはここにいる

もしも もう一度あなたに会えるなら

もしも もう一度あなたに会えるなら

たった一言伝えたい

ありがとう

ありがとう

もしも もう一度あなたに会えるなら

もしも もう一度あなたに会えるなら

たった一言伝えたい

もしも もう一度あなたに会えるなら

たった一言伝えたい

ありがとう

ありがとう

時には傷つけあっても

時には傷つけあっても

あなたを感じてたい

点击右上角即可分享
微信分享提示