C#中的范型对于很多从C++转过来的程序员来说,可以说是一个天大的喜讯。hehe,至少笔者对于这个新特性是充满了敬仰之情。
在C#2.0中,匿名方法、IEnumerable接口和匿名方法的合作,使很多的编程任务变得非常的简单,而且写出来的程序非常的优美。
比如,我们可以写出如下的代码:
List<Book> thelib = Library.getbooks();
List<Book> found = thelib.FindAll(delegate(Book curbook)
{
if (curbook.isbn.StartsWith("..."))
return true;
return false;
});
foreach (Book b in found)
Console.WriteLine(b.isbn);
这段程序非常简单的展示给我们需要查找的信息,代码也非常的直接易懂。内置的数据结构给了我们强大的算法支持,不过,能不能够为自定义的类定义类似的算法呢?
比如,如果我有一个自定义的Library类并没有使用List<Book>存储数据,而是使用某种自定义的数据结构,我能不能也让用户使用类似的语法,忽略存储细节的使用匿名委托来实现特定的算法呢?
答案当然是肯定的,而且在C#中实现这样的功能是非常的简单。
首先让我们看看FindAll中用到的匿名委托的原型
public delegate bool Predicate<T>(T obj);
很明显的,上面的代码等于注册了一个搜索的回调,而在List内部定义了某种遍历的机制,从而实现了一个漂亮的算法结构Closure。
看到了这些,我们就可以定义自己的算法结构了,首先,我定义了一个如下的类
public class MyVec<T>
{
public static MyVec<T> operator +(MyVec<T> a, T b)
{
a._list.Add(b);
return a;
}
public override string ToString()
{
StringBuilder builder = new StringBuilder();
foreach (T a in _list)
{
builder.Append(a.ToString());
builder.Append(",");
}
string ret = builder.Remove(builder.Length - 1, 1).ToString();
return ret;
}
public MyVec<T> findAll(Predicate<T> act)
{
MyVec<T> t2 = new MyVec<T>();
foreach(T i in _list)
{
if (act(i))
t2._list.Add(i);
}
return t2;
}
// this is the inner object
private List<T> _list = new List<T>();
}
这个类中包含了一个的List<T>结构,主要是为了证实我们的想法是否可行,事实上,任何一个可以支持foreach遍历的结构都可以作为内置的数据存储对象,我们会在后面的例子中给出一个更加复杂的实现。
下面是用于测试这个实验类的代码:
static void Main(string[] args)
{
MyVec<int> a = new MyVec<int>();
a += 12;
a += 15;
a += 32;
MyVec<int> b = a.findAll(delegate(int x)
{ if (x > 20) return true; return false; }
);
Console.WriteLine("vection original");
Console.WriteLine(a.ToString());
Console.WriteLine("vection found");
Console.WriteLine(b.ToString());
Console.ReadLine();
}
编译,执行,程序输出:
vection original
12,15,32
vection found
32
和我们预期的完全相同。很明显的,List内部的算法与我们预期的基本相同。
Predicate<T>仅仅是为了仿照系统的实现而采用的一个委托,事实上可以使用自己定义的任何委托作为回调的函数体。
通过使用IEnumberable接口,可以实现对任意结构的遍历,从而对任何数据结构定义强大的算法支持。
分享到:
相关推荐
58 <br>0081 文本中首字母改为大写 59 <br>0082 C#随机数的产生 59 <br>0083 身份证从15位升至18位算法 60 <br>0084 十进制数转二进制数的算法 60 <br>0085 十进制数转八进制数的算法 61...
(整理)文献检索 土木工程项目成本管理.doc
(C++)利用keil编写51单片机收集温湿度的代码,并且利用QT实现一个简单的串口通信界面来接受单片机收集到的温湿度数据发送到PC端,其中下位机利用protues来实现.zip
实验二 数码管显示驱动设计
双动子龙门模组sw16可编辑_三维3D设计图纸_三维3D设计图纸.zip
内容概要:本文详细介绍了利用Norrbin/Fossen模型和反步法(PID)控制算法实现无人船(USV)路径跟踪的方法,特别是在存在洋流扰动的情况下。首先,文章解释了Norrbin模型用于描述船舶低频运动特性的优势,并展示了如何将洋流速度从惯性坐标系转换到船体坐标系。接着,讨论了LOS制导算法的改进,使其能够适应洋流影响。然后,阐述了反步法控制律的设计及其与PID控制的结合,强调了虚拟控制量的设计和参数调整的重要性。最后,通过Matlab/Simulink进行建模和仿真实验,验证了该方法的有效性,并提供了详细的代码实现和可视化结果。 适合人群:从事无人船控制系统研究和开发的技术人员,尤其是对路径跟踪和海洋环境扰动补偿感兴趣的工程师和研究人员。 使用场景及目标:适用于需要提高无人船在复杂海况下路径跟踪精度的应用场合,如海洋测绘、环境监测等。目标是通过引入先进的控制算法,减少洋流等外界因素对路径跟踪性能的影响,从而提高系统的鲁棒性和可靠性。 其他说明:文中提供的代码片段和仿真结果有助于读者理解和复现实验过程。同时,作者分享了许多实践经验,如参数调整技巧和常见错误避免,对于初学者非常有帮助。此外,文章还提出了未来的研究方向,如加入自适应观测器以进一步改善抗扰动性能。
elasticsearch-analysis-ik-8.17.4.zip
内容概要:本文详细介绍了煤矿开挖区三维渗流仿真及其应力场耦合计算的关键技术和实现方法。首先,利用Python的pyvista库进行地质数据处理和三维可视化,确保模型结构完整。接着,采用FEniCS进行有限元求解,基于达西定律计算渗流场,并引入变渗透率模型处理渗透系数的变化。应力场计算则基于修正的Mohr-Coulomb准则,重点处理渗流-应力耦合项。通过ParaView进行可视化,展示了渗流路径和应力分布情况。文中还讨论了实际工程应用中的优化技巧,如并行计算、HDF5分块存储等。 适合人群:从事矿山工程、岩土力学、渗流力学研究的专业人士和技术人员。 使用场景及目标:适用于煤矿开采过程中对渗流场和应力场的预测和分析,帮助识别潜在的安全隐患,如突水风险点。通过仿真结果指导现场施工,提高安全性和经济效益。 其他说明:文中提供了多个Python代码片段,涵盖从模型构建到后处理的各个环节,有助于读者理解和复现相关技术细节。强调了理论与实际相结合的重要性,指出数值模型虽不能绝对精确,但能提供重要的参考依据。
内容概要:本文详细介绍了如何利用COMSOL Multiphysics 6.1版本进行3258-3824Hz频段内的声波阵面调控。主要内容涵盖模型搭建、材料参数设置、扫频方法、耦合边界条件以及后处理技巧。文中强调了压力声学和固体力学模块之间的耦合重要性,并提供了具体的代码示例来指导用户完成各项任务。此外,还讨论了一些常见的陷阱及其解决方案,如网格划分、求解器选择等。 适合人群:从事声学工程、机械工程及相关领域的研究人员和技术人员,尤其是那些希望深入了解COMSOL软件在声波调控方面应用的人士。 使用场景及目标:适用于需要精确控制声波传播路径的研究项目,例如开发新型声学设备或改进现有产品的声学性能。通过掌握文中提到的技术手段,可以帮助用户更好地理解和预测不同条件下声波的行为特征。 其他说明:文中不仅提供了理论解释,还有大量实用的操作提示和代码片段,便于读者快速上手实践。同时,作者分享了许多个人经验和心得,有助于避免常见错误并提高工作效率。
2017学年第二学期期末考试《土木工程制图》大作业.pdf
基于51单片机protues仿真的自动水龙头系统设计(仿真图、源代码、AD原理图、流程图) 自动水龙头设计 1、当人或物体靠近时,水龙头自动防水,而人或物体离开时水龙头自动关闭 2、采用红外传感器 3、使用电磁阀控制开关 4、设定延时,如果人或物体长时间没有离开,自动关闭水龙头; 5、仿真图、源代码、AD原理图、流程图;
可调角度带式锯床sw23可编辑_三维3D设计图纸_三维3D设计图纸.zip
内容概要:本文详细介绍了ResNet神经网络模型的构建与实现。首先定义了一个通用的倒置瓶颈块(UniversalInvertedBottleneckBlock),它包括三个卷积层和批标准化层,并引入了残差连接机制。接着基于此构建了Bottleneck模块,进一步扩展了倒置瓶颈块的功能,同样包含了跳跃连接来缓解梯度消失问题。最后,ResNet类整合了多个Bottleneck模块形成完整的网络结构,通过_make_layer方法按需创建不同深度的网络层。文中还提供了resnet50函数用于快速实例化预定义配置下的ResNet模型,并展示了如何创建模型实例、准备输入数据以及进行前向传播计算。 适合人群:对深度学习有一定了解,特别是熟悉PyTorch框架的开发者或研究人员;希望深入理解ResNet架构及其组件的工作原理的学习者。 使用场景及目标:①理解ResNet中倒置瓶颈结构的设计思想及其实现细节;②掌握如何利用PyTorch搭建复杂神经网络模型;③学习如何通过调整网络层数和参数设置来自定义适合特定任务需求的ResNet模型。 阅读建议:本文代码量较大,建议读者先熟悉PyTorch的基础操作,然后逐步阅读每个类和函数的定义,注意理解各部分之间的关系。可以尝试修改代码中的参数或者添加新的功能来进行实践练习。同时,可以通过查阅官方文档或相关资料加深对某些概念的理解。
小学,初中,高中 沉浸式虚拟现实3DLED屏 VR未来智慧教室 建设方案书.docx
内容概要:本文介绍了一种将物理信息融入Transformer模型用于高速公路车辆轨迹预测的新方法——PIT-IDM模型。该模型结合了Transformer强大的数据捕捉能力和IDM驾驶模型的物理约束特性,在每个时间步进行交替更新,确保预测结果既符合数据规律又遵守物理常识。文中详细描述了模型架构、关键组件如IDM参数估计器和自注意力机制的具体实现,以及训练策略和损失函数设计。实验结果显示,相较于传统的纯数据驱动模型,PIT-IDM在cut-in场景下的预测精度提高了23%,并且能够有效避免非物理性的离谱预测。 适合人群:对深度学习、自动驾驶技术和车辆轨迹预测感兴趣的科研人员和技术开发者。 使用场景及目标:适用于高速公路车辆轨迹预测的研究和应用开发,旨在提高预测准确性,尤其是在复杂交通状况下的短期预测性能。 其他说明:文中还讨论了一些具体的工程实现细节,如计算开销优化、数据预处理方法以及应对极端情况的解决方案。此外,作者指出该方法可以扩展应用于其他时序预测任务,如电力负荷预测和股票市场预测等。
内容概要:本文详细对比了递归与迭代两种编程方法,解释了它们在不同应用场景下的优缺点。文中通过多个选择题解析了递归基、递归参数等概念,强调了递归基的重要性,指出它是递归函数停止调用自身的条件。同时,通过实例展示了如何使用递归和迭代实现阶乘、斐波那契数列、数组求和等功能,并讨论了递归与迭代在内存占用、执行效率等方面的差异。此外,文章还探讨了递归和迭代在搜索算法(如广度优先搜索、深度优先搜索)、排序算法(如快速排序、归并排序)中的应用,指出了递归在处理树形结构和分治问题时的优势,以及迭代在处理有明确循环次数的任务时的高效性。 适合人群:具备一定编程基础的学习者,尤其是对递归和迭代概念存在疑惑的程序员。 使用场景及目标:①理解递归和迭代的基本概念及其在实际编程中的应用;②掌握递归基的作用,避免无限递归;③学会根据问题特点选择合适的算法实现方式,优化程序性能。 其他说明:本文不仅提供了理论知识,还通过具体的代码示例加深理解,建议读者在学习过程中动手实践,尝试将递归算法转换为迭代算法,以更好地掌握两者之间的转换技巧。
java
基于单片机protues仿真的厨房环境监测系统(仿真图、源代码、AD原理图、流程图) 基于单片机的厨房环境监测系统。 1、测量温湿度、烟雾浓度、co浓度,粉尘,然后超出范围响警报。 2、有0832、51单片机、mq2烟雾传感器、LCD1602液晶显示,灯光电路、按键电路、警报器电路。 3、都可调报警值。 4、传感器可用电位器代替。 5、厨房温湿度,烟雾,CO,粉尘; 6、仿真图、源代码、AD原理图、流程图;
内容概要:本文详细介绍了PEM(质子交换膜)电解槽CCM(催化剂涂层膜)的电化学仿真过程,重点探讨了使用Nafion 115膜作为电解质时的关键参数设置及其对仿真结果的影响。文中通过具体的代码示例展示了如何调整催化层厚度、孔隙率、交换电流密度等参数,并讨论了不同参数组合对极化曲线、电流密度分布以及电解槽效率的具体影响。此外,文章还分享了一些实用技巧,如避免常见错误、优化边界条件设置等。 适合人群:从事燃料电池研究、电化学仿真领域的科研人员和技术开发者。 使用场景及目标:帮助研究人员更好地理解和优化PEM电解槽的工作性能,特别是在催化层设计和参数选择方面提供指导。通过调整关键参数,提高电解槽的效率和稳定性,为实际应用提供理论支持。 其他说明:文章不仅提供了详细的参数调整方法,还强调了仿真过程中需要注意的实际问题,如参数之间的相互影响、边界条件的正确设置等。同时,作者通过幽默风趣的语言使复杂的技术内容更加易懂。
【LPSO-BP分类】基于改进莱维飞行和混沌映射的粒子群优化算法优化BP神经网络分类研究(Matlab代码实现)