C# 使用DataView.RowFilter中的运算符筛选自定义可比较类

C# 使用DataView.RowFilter中的运算符筛选自定义可比较类,c#,csv,C#,Csv,CSV文件中的一列包含分数。当前,使用实现IComparable和比较运算符的自定义Fraction类将文件读入DataTable。我希望能够使用行过滤器,例如“分数>1/2”。尝试此操作会导致无法在WindowsFormsApplication1.Fraction和System.Double上执行'>'操作,即使Fraction实现了IComparable并定义了运算符。我如何解决这个问题,或者有什么解决方法 示例CSV文件 1/2 1/3 2 0 1 读取CSV文件 1/2 1/3 2 0

CSV文件中的一列包含分数。当前,使用实现
IComparable
和比较运算符的自定义
Fraction
类将文件读入
DataTable
。我希望能够使用
行过滤器
,例如
“分数>1/2”
。尝试此操作会导致
无法在WindowsFormsApplication1.Fraction和System.Double上执行'>'操作,即使Fraction实现了
IComparable
并定义了
运算符。我如何解决这个问题,或者有什么解决方法

示例CSV文件

1/2
1/3
2
0
1
读取CSV文件

1/2
1/3
2
0
1
TextFieldParser parser=newtextfieldparser(Environment.CurrentDirectory+“\\data.csv”);
parser.TextFieldType=FieldType.Delimited;
parser.SetDelimiters(“,”);
DataTable数据=新DataTable();
数据。列。添加(“分数”,类型(分数));
而(!parser.EndOfData)
{
string[]input=parser.ReadFields();
对象[]输出=新对象[input.Length];
输出[0]=新分数(输入[0]);
data.Rows.Add(输出);
}
这是我在阅读CSV文件后想做的事情。但是,这会导致
无法在WindowsFormsApplication1.Fraction和System.Double上执行'>'操作

DataView匹配=新的DataView(数据);
matches.RowFilter=“分数>1/2”;
dataGridView1.DataSource=匹配项;
分数

类分数:i可比较
{
私人int n;
私人int d;
公共分数(字符串值)
{
尝试
{
n=转换为32(值);
d=1;
}
捕获(例外)
{
n=Convert.ToInt32(value.Split('/')[0]);
d=转换为32(值分割('/')[1]);
}
减少();
}
私人股本减少()
{
int gcd=gcd(n,d);
n=n/gcd;
d=d/gcd;
if(d<0)
{
n=-1*n;
d=-1*d;
}
}
专用静态整数GCD(整数a、整数b)
{
回报率(b==0)?a:GCD(b,a%b);
}
私有双ToDouble()
{
返回(双)不适用;
}
公共重写字符串ToString()
{
返回n+((d==1)?“”:“/”+d);
}
公共整数比较(对象对象对象)
{
分数f=(分数)obj;
返回这个f-1:0;
}
公共覆盖布尔等于(对象对象对象)
{
if(obj是分数)
{
分数f=(分数)obj;
返回n==f.n&&d==f.d;
}
else if(对象为int)
{
int i=(int)obj;
返回n==i&&d==1;
}
否则,如果(obj为双精度)
{
双x=ToDouble();
双y=(双)obj;
返回!(xy);
}
其他的
{
返回false;
}
}
公共覆盖int GetHashCode()
{
返回n.GetHashCode()*17+d.GetHashCode();
}
公共静态布尔运算符==(分数a,分数b){返回a.Equals(b);}
公共静态布尔运算符!=(分数a,分数b){返回!a.Equals(b);}
公共静态布尔运算符(分数a,分数b){返回a.n*b.d>b.n*a.d;}
公共静态布尔运算符=b.n*a.d;}
公共静态布尔运算符==(分数a,整数b){返回a.Equals(b);}
公共静态布尔运算符=(分数a,int b){返回!a等于(b);}
公共静态布尔运算符(分数a,int b){返回a.n>b*a.d;}
公共静态布尔运算符=b*a.d;}
公共静态布尔运算符==(分数a,双b){返回a.Equals(b);}
公共静态布尔运算符=(分数a,双b){返回!a等于(b);}
公共静态布尔运算符(分数a,双b){返回a.n>b*a.d;}
公共静态布尔运算符=b*a.d;}
公共静态隐式运算符分数(字符串s){返回新分数(s);}
公共静态隐式运算符字符串(分数f){返回f.ToString();}
公共静态隐式运算符双(分数f){返回f.ToDouble();}
}

你好,Linus,如果您能详细介绍一下您行动的主要目的,我将很乐意为您提供帮助:您将如何处理结果等。我有几个想法,希望提供一个好主意!我想使用在
文本框中输入的过滤器“搜索”CVS文件,然后在
DataGridView
中显示结果。这完全是我自己用的。这些CVS文件的问题在于,它们包含的列的类型(如前面提到的分数)需要自定义排序,但也应该易于筛选,最好使用比较运算符(
==
,等等)。还有一些列主要包含整数,但也包含一些字符串。这些还应该使用比较运算符(字符串可以考虑在这些列中的整数之后)来过滤。