当前位置:首页 > 工具 > 正文内容

.NET 中的延迟类型转换集合实现

访客 工具 2026年9月30日 8

在日常开发中,我们经常需要对对象集合进行类型转换操作。为了提高性能并减少内存占用,可以实现一个按需转换的集合包装器。

该实现具有以下优势:

  • 采用延迟执行机制,仅在访问元素时进行转换,避免一次性创建完整的目标集合副本
  • 支持在转换过程中传入额外参数,增强灵活性

应用示例

namespace CLK.Collections.ConsoleApplication
{
    public class User
    {
        public string LastName = string.Empty;
        public string FirstName = string.Empty;
    }

    public class Data
    {
        public string DisplayName = string.Empty;
    }

    class Program
    {
        static void Main(string[] args)
        {            
            User[] users = new User[2];
            users[0] = new User { LastName = "Chou", FirstName = "Clark" };
            users[1] = new User { LastName = "AAAA", FirstName = "BBBBB" };

            IEnumerable<Data> dataList = BuildDataCollection(users, "★★★★★");
            foreach (Data item in dataList)
            {
                Console.WriteLine(item.DisplayName);
            }
            Console.WriteLine("");

            Console.WriteLine("End");
            Console.ReadLine();
        }

        static IEnumerable<Data> BuildDataCollection(IEnumerable<User> sourceUsers, string prefix)
        {
            return new LazyCastCollection(sourceUsers, (user) => TransformUser(user, prefix));
        }

        static Data TransformUser(User user, string prefix)
        {
            return new Data 
            { 
                DisplayName = prefix + user.LastName + "." + user.FirstName + prefix 
            };
        }
    }  
}

核心实现

namespace CLK.Collections
{
    public class LazyCastCollection : IEnumerable<TResult>
    {
        private readonly IEnumerable<TSource> _sourceCollection;
        private readonly CastTransformDelegate _transformDelegate;

        public LazyCastCollection(IEnumerable<TSource> source, CastTransformDelegate transformer)
        {
            if (source == null) throw new ArgumentNullException(nameof(source));
            if (transformer == null) throw new ArgumentNullException(nameof(transformer));
            
            _sourceCollection = source;
            _transformDelegate = transformer;
        }

        public IEnumerator<TResult> GetEnumerator()
        {
            return new LazyCastIterator(_sourceCollection.GetEnumerator(), _transformDelegate);
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }
    }
}
namespace CLK.Collections
{
    public class LazyCastIterator : IEnumerator<TResult>
    {
        private readonly IEnumerator<TSource> _sourceIterator;
        private readonly CastTransformDelegate _transformDelegate;
        private TResult _currentItem = default(TResult);

        public LazyCastIterator(IEnumerator<TSource> sourceIterator, CastTransformDelegate transformer)
        {
            if (sourceIterator == null) throw new ArgumentNullException(nameof(sourceIterator));
            if (transformer == null) throw new ArgumentNullException(nameof(transformer));
            
            _sourceIterator = sourceIterator;
            _transformDelegate = transformer;
        }

        public void Dispose()
        {
            _sourceIterator.Dispose();
            _currentItem = default(TResult);
        }

        public TResult Current => _currentItem;

        object System.Collections.IEnumerator.Current => Current;

        public bool MoveNext()
        {
            if (_sourceIterator.MoveNext())
            {
                _currentItem = _transformDelegate(_sourceIterator.Current);
                return true;
            }
            return false;
        }

        public void Reset()
        {
            _sourceIterator.Reset();
            _currentItem = default(TResult);
        }
    }
}
public delegate TResult CastTransformDelegate(TSource source);

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。