适合每位开发人员的 60 个 C# 代码片段( 五 )


当需要对集合执行复杂操作时
对集合进行过滤或排序
6. 可观察集合ObservableCollection<string> collection = new ObservableCollection<string>();collection.CollectionChanged += (s, e) => { /* Handle change */ };collection.Add("A");可观察集合使您可以轻松地对集合中的更改做出反应 。这就像每当有人发布新的猫视频时都会收到通知!
用例:
当您需要根据集合中的更改更新 UI 时
记录对集合的更改
7. 并发收集ConcurrentDictionary<int, string> concurrentDictionary = new ConcurrentDictionary<int, string>();
System.Collections.Concurrent 命名空间提供了多个可以在多个线程中安全使用的集合 。这使您不必处理锁和其他同步原语 。它就像一个预先打包的、无麻烦的多线程解决方案!
用例:
当需要从多个线程访问集合时
避免手动同步
8.IComparer<T>和IEqualityComparer<T>接口class MyComparer : IComparer<int>{public int Compare(int x, int y){// Reverse orderreturn y.CompareTo(x);}}List<int> list = new List<int> { 1, 2, 3, 4, 5 };list.Sort(new MyComparer());IComparer<T> 和 IEqualityComparer<T> 接口允许您自定义元素的比较方式以及它们是否被视为相等 。这就像决定自己的游戏规则一样!
用例:
当您需要以特定方式对集合进行排序时
根据特定标准比较元素
9. 使用GroupBy对元素进行分组List<int> list = new List<int> { 1, 2, 3, 4, 5 };var groups = list.GroupBy(x => x % 2 == 0 ? "Even" : "Odd");GroupBy 方法允许您根据特定标准对元素进行分组 。这就像按颜色和尺寸整理袜子抽屉一样!
用例:
当您需要根据特定标准对元素进行分组时
对每个组分别进行操作
10.AnyandAll方法List<int> list = new List<int> { 1, 2, 3, 4, 5 };bool anyEven = list.Any(x => x % 2 == 0);// Truebool allPositive = list.All(x => x > 0);// TrueAny 和 All 方法提供了一种声明性方式来检查集合中的任何或所有元素是否满足条件 。这就像快速检查盒子里是否还有巧克力,或者篮子里的所有苹果是否都熟了!
用例:
当您需要检查任何或所有元素是否满足条件时
避免手动编写循环
10 个代表和活动片段1. 组播代表Action<int> action1 = x => Console.WriteLine($"Action 1: {x}");Action<int> action2 = x => Console.WriteLine($"Action 2: {x}");Action<int> combined = action1 + action2;combined(5);// Executes both actions您可以将多个委托合并为一个多播委托 。这就像邀请所有朋友参加同一个聚会!
用例:
当你想通知多个监听者时
简化执行多个回调的代码
2. 弱事件模式public class WeakEventHandler<TEventArgs>{private readonly WeakReference _targetReference;private readonly MethodInfo _method;public WeakEventHandler(EventHandler<TEventArgs> eventHandler){_targetReference = new WeakReference(eventHandler.Target);_method = eventHandler.Method;}public void Invoke(object sender, TEventArgs e){if (_targetReference.IsAlive)_method.Invoke(_targetReference.Target, new object[] { sender, e });}}即使事件源仍然存在,弱事件模式也允许对侦听器进行垃圾收集 。这就像在没有人注意到的情况下离开聚会一样!
用例:
当您想避免长期对象中的内存泄漏时
确保短命监听器不会延长监听器的寿命
3. 通用委托public delegate TResult MyFunc<T1, T2, TResult>(T1 arg1, T2 arg2);您可以定义适用于任何类型的通用委托 。它就像代表代表类型的瑞士军刀!
用例:
当您需要一个适用于不同类型的委托时
编写更多可重用且类型安全的代码
4. 具有自定义 EventArgs 的事件public class MyEventArgs : EventArgs{public string Message { get; set; }}public class MyClass{public event EventHandler<MyEventArgs> MyEvent;protected virtual void OnMyEvent(string message){MyEvent?.Invoke(this, new MyEventArgs { Message = message });}}您可以定义自定义 EventArgs 以提供有关事件的更多信息 。这就像发送详细的报告而不是简短的通知!
用例:
当您需要提供活动的附加信息时
创建更具表现力和信息量的活动
5. 委托中的协变和逆变Func<object> objectFunc = () => new object();Func<string> stringFunc = objectFunc;// CovarianceAction<string> stringAction = str => Console.WriteLine(str);Action<object> objectAction = stringAction;// Contravariance协变和逆变允许您以保留类型兼容性的方式分配委托 。这就像将方钉安装到圆孔中,但是以类型安全的方式!


推荐阅读