Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-08-07 16:58:28

当然可以!下面是一道**专家级别**的 C# 程序员逻辑面试题,涉及 **泛型、委托、闭包、线程安全、表达式树(Expression Trees)** 和 **设计模式** 的综合运用,适合考察高级开发者的综合能力。

---

### 🧠 面试题:实现一个线程安全、延迟编译的条件过滤器工厂

#### 背景:
你正在开发一个高性能的规则引擎,需要支持动态构建过滤器(`Func`),并能根据条件组合进行高效执行。

#### 任务:
请实现一个泛型类 `FilterFactory`,满足以下要求:

1. **支持动态添加条件表达式**(使用 `Expression>`)。
2. **可以组合多个条件**(AND / OR)。
3. **支持缓存已编译的委托**(避免重复编译表达式树,提升性能)。
4. **线程安全**(多个线程并发使用时不会出错)。
5. **延迟编译**(只在第一次调用时才编译表达式)。
6. **支持注册命名条件**,例如 `"HighPriority"` 或 `"IsLocal"`,供后续组合使用。

---

### 示例用法:

```csharp
var factory = new FilterFactory();

factory.Register("IsActive", x => x.IsActive);
factory.Register("IsLocal", x => x.Region == "LOCAL");

var filter1 = factory.And("IsActive", "IsLocal");
var filter2 = factory.Or("IsActive", x => x.Score > 90);

List data = GetData();

// 应用组合条件
var result1 = data.Where(d => filter1.Compile()(d));
var result2 = data.Where(d => filter2.Compile()(d));
```

---

### 要求:

- 实现 `FilterFactory` 类。
- 实现 `Register`, `And`, `Or` 方法。
- 使用 `Expression` 来构建组合逻辑。
- 使用线程安全机制(如 `ConcurrentDictionary`, `Lazy`, `lock` 等)。
- 可以使用 `Expression.Invoke` 或表达式树拼接实现组合。

---

### 可选加分项:

- 支持嵌套组合(例如:`And(Or("A", "B"), Not("C"))`)。
- 支持缓存组合后的表达式和编译后的委托。
- 支持条件复用、别名机制。
- 提供单元测试验证逻辑正确性。

---

### 💡 提示:

- 可使用 `Expression.AndAlso` / `Expression.OrElse` 来组合条件。
- 使用 `Expression.Lambda>` 重新生成组合后的表达式。
- 使用 `ConcurrentDictionary>>>` 来缓存注册的表达式。
- 可以使用 `Lazy` 来实现延迟编译。

---

是否需要我提供参考答案?

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: c#题例-2025-08-07 22:31:54

下一篇: c#题例-2025-08-07 11:25:05

精华推荐