回 帖 发 新 帖 刷新版面

主题:[讨论]C#问题求教

我在用C#做一个数学函数计算程序,其中自定义了很多类型,比如复数、向量等。
由于我用ARRAYLIST作为保存用户输入的数学算式中的数值,这些数值可能是INT,可能是DOUBLE,更可能是复数或者向量。数值的数量是实现不知道的,所以我用了ARRAYLIST(更主要是其中需要对数组进行删减操作)。但是现在有一个问题,就是ARRAYLIST的元素都是OBJECT。当我限定为实数的运算的时候,问题还不是很严重,清一色地把STRING转成DOUBLE就可以了。但是现在存在实数、复数和向量三种,我应该怎么做?关键问题就是无法直接把OBJECT进行运算,而对ARRAYLIST中每个元素,由于事先不知道它是什么类型,也无法做出预先的判断,都靠程序自己来判断和转换类型。但是转换类型的申明又必须是事先就给定的。在VB中可以申明为VARIANT而不是OBJECT,这个问题就解决了,但是C#中似乎没有和VARIANT对应的东西。
而且,我打算以后再增加矩阵等内容的。能否提供一个对未来的功能拓展来说需要修改的量最少的代码方案?甚至是那种可以由用户自己定义某种数学结构并且在程序中支持运算的代码方案。
望高人指点,谢谢。

回复列表 (共4个回复)

沙发

同意你的想法!我曾经用VB作过一个计算器!不过可没敢把复数、矢量跟实数放在一起,而是分开来处理,我的建议是建立一个“复数类”,单独处理!
  不过我的个人想法是从实用性来看,放在一起处理的实际意义不大!比如说复数:4 + 3i,何以见得i不表示未知数呢(它和x一样都是字母嘛)?我看只单独分开处理就可以了,如果你希望单独写成一个以字符串为参数的方法,那么就给该方法添加一个表示计算类别的参数,不是更有实际意义!
  我最近有一个项目需要处理一些比较复杂的数学表达式:如微分方程、定积分等!
  如果有兴趣可以发邮件给我:dewater@126.com

板凳

as转换类型,然后判断结果是否为null
或者
先用is判断是否类型符合,再强制转换

推荐用第一种,效率相对来说较高。

不过对于你所要应用的数学计算模块中,如果不做优化那么很难提高效率,毕竟转化是很耗的。

做个优化吧:
别用ArrayList,用List<>泛型类,内部类型采用向量,然后存储时把实数和复数都转换成向量,然后光存储向量,计算时也光计算向量就行了。这样也可以省掉类型转换的消耗。
细节部分还可以再优化。

3 楼

[quote]同意你的想法!我曾经用VB作过一个计算器!不过可没敢把复数、矢量跟实数放在一起,而是分开来处理,我的建议是建立一个“复数类”,单独处理!
  不过我的个人想法是从实用性来看,放在一起处理的实际意义不大!比如说复数:4&nbsp;+&nbsp;3i,何以见得i不表示未知数呢(它和x一样都是字母嘛)?我看只单独分开处理就可以了,如果你希望单独写成一个以字符串为参数的方法,那么就给该方法添加一个表示计算类别的参数,不是更有实际意义!
  我最近有一个项目需要处理一些比较复杂的数学表达式:如微分方程、定积分等!
  如果有兴趣可以发邮件给我:dewater@126.com[/quote]
其实,本来就是建立一个“复数类”的。但是数学上实数和复数是需要在一起处理的。而用户输入的数据特别是没有i这样的标记的数可以说是实的也可以说是复的。还有就是实数和向量之间也存在乘法运算。所以单独处理其实是不可能的。
然后是实际意义的问题,我认为意义很大。你为什么一定要用i做未知数呢?这个可以在帮助文档中对用户说明清楚。
如果是要附加参数,对用户来说是一个很不让人习惯和舒服的设计。写程序就要考虑到用户的感受嘛。

其实这个程序的VB版我N个月前就写好了。最近在学C#,所以就用C#重写一次,结果就遇到了这个问题。
在这里不得不说,变量控制和转换方面VB比C#灵活。当然,灵活有灵活的缺点,不过在这个程序中它是优点。

4 楼

[quote]as转换类型,然后判断结果是否为null
或者
先用is判断是否类型符合,再强制转换

推荐用第一种,效率相对来说较高。

不过对于你所要应用的数学计算模块中,如果不做优化那么很难提高效率,毕竟转化是很耗的。

做个优化吧:
别用ArrayList,用List<>泛型类,内部类型采用向量,然后存储时把实数和复数都转换成向量,然后光存储向量,计算时也光计算向量就行了。这样也可以省掉类型转换的消耗。
细节部分还可以再优化。[/quote]
范型的确是一个好建议,但是我用的不是C#2.0……其实如何用泛型我有概念和思路的,但是奈何我用的是C#1.0……
然后,你前面说的方法,我也想到过,但是我感觉使用性不高。因为这么做的话需要IF吧,按时似乎IF以后的申明其变量的存在域是在IF模块中的(VB.NET中是这样)。又不能对IF的上级域中的变量进行重定义的咯。
不过,还是谢谢了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册