如何比较 IFormatProvider?
How to compare IFormatProvider?
我有一个网格用户控件。它使用 IFormatProvider 对单元格中的文本进行格式化以供显示。每个 Cell 允许设置自己的 IFormatProvider。根据单元格的 DisplayText 请求,程序依次调用单元格的 IFormatProvider,然后是列的 IFormatProvider。我制作了一个数组来保存所有不相同的 IFormatProvider,这样我只需要保存 ID 即可检索格式。
如何比较IFormatProvider?如果不同,存入数组。
private IFormatProvider[] FormatProviders;
internal short CreateNewFormatProviders(IFormatProvider newFormatProvider)
{
if (newFormatProvider == null) // (IFormatProvider.Equals(newFormatProvider,null))
{
return -1;
}
int len = this.FormatProviders.Length;
for (int i = 0; i < len; i++)
{
if (IFormatProvider.Equals(this.FormatProviders[i],newFormatProvider))
{
return (short)i;
}
}
Array.Resize<IFormatProvider>(ref this.FormatProviders, len + 1);
this.FormatProviders[len] = newFormatProvider;
return (short)len;
}
在上面的代码中,我使用了IFormatProvider.Equals。是否有效或有更好的方法?
注意:我为 IFormatProvider
设置的所有类型都是自定义的,并实现了 .ToString
和 return 唯一值。如果您不是这种情况,则此方法无效。
调试后,我使用.ToString() 来检查是否重复。
private IFormatProvider[] FormatProviders = new IFormatProvider[1];
internal short CreateNewFormatProviders(IFormatProvider newFormatProvider)
{
if (newFormatProvider == null) // (IFormatProvider.Equals(newFormatProvider,null))
{
return -1;
}
if (this.FormatProviders[0] == null)
{
this.FormatProviders[0] = newFormatProvider;
return 0;
}
int len = this.FormatProviders.Length;
for (int i = 0; i < len; i++)
{
//if (IFormatProvider.Equals(this.FormatProviders[i],newFormatProvider)) *always return False*
if (newFormatProvider.ToString() == this.FormatProviders[i].ToString())
{
return (short)i;
}
}
Array.Resize<IFormatProvider>(ref this.FormatProviders, len + 1);
this.FormatProviders[len] = newFormatProvider;
return (short)len;
}
测试代码:
IFormatProvider newfmt1 = new CustomFormatProvider1();
IFormatProvider newfmt1_ = new CustomFormatProvider1();
IFormatProvider newfmt2 = new CustomFormatProvider2();
short index_newfmt1 = CreateNewFormatProviders(newfmt1);
short index_newfmt1_= CreateNewFormatProviders(newfmt1_);
short index_newfmt2= CreateNewFormatProviders(newfmt2);
结果如我所料:
index_newfmt1 = 0
index_newfmt1_ = 0
index_newfmt2 = 1
我有一个网格用户控件。它使用 IFormatProvider 对单元格中的文本进行格式化以供显示。每个 Cell 允许设置自己的 IFormatProvider。根据单元格的 DisplayText 请求,程序依次调用单元格的 IFormatProvider,然后是列的 IFormatProvider。我制作了一个数组来保存所有不相同的 IFormatProvider,这样我只需要保存 ID 即可检索格式。
如何比较IFormatProvider?如果不同,存入数组。
private IFormatProvider[] FormatProviders;
internal short CreateNewFormatProviders(IFormatProvider newFormatProvider)
{
if (newFormatProvider == null) // (IFormatProvider.Equals(newFormatProvider,null))
{
return -1;
}
int len = this.FormatProviders.Length;
for (int i = 0; i < len; i++)
{
if (IFormatProvider.Equals(this.FormatProviders[i],newFormatProvider))
{
return (short)i;
}
}
Array.Resize<IFormatProvider>(ref this.FormatProviders, len + 1);
this.FormatProviders[len] = newFormatProvider;
return (short)len;
}
在上面的代码中,我使用了IFormatProvider.Equals。是否有效或有更好的方法?
注意:我为 IFormatProvider
设置的所有类型都是自定义的,并实现了 .ToString
和 return 唯一值。如果您不是这种情况,则此方法无效。
调试后,我使用.ToString() 来检查是否重复。
private IFormatProvider[] FormatProviders = new IFormatProvider[1];
internal short CreateNewFormatProviders(IFormatProvider newFormatProvider)
{
if (newFormatProvider == null) // (IFormatProvider.Equals(newFormatProvider,null))
{
return -1;
}
if (this.FormatProviders[0] == null)
{
this.FormatProviders[0] = newFormatProvider;
return 0;
}
int len = this.FormatProviders.Length;
for (int i = 0; i < len; i++)
{
//if (IFormatProvider.Equals(this.FormatProviders[i],newFormatProvider)) *always return False*
if (newFormatProvider.ToString() == this.FormatProviders[i].ToString())
{
return (short)i;
}
}
Array.Resize<IFormatProvider>(ref this.FormatProviders, len + 1);
this.FormatProviders[len] = newFormatProvider;
return (short)len;
}
测试代码:
IFormatProvider newfmt1 = new CustomFormatProvider1();
IFormatProvider newfmt1_ = new CustomFormatProvider1();
IFormatProvider newfmt2 = new CustomFormatProvider2();
short index_newfmt1 = CreateNewFormatProviders(newfmt1);
short index_newfmt1_= CreateNewFormatProviders(newfmt1_);
short index_newfmt2= CreateNewFormatProviders(newfmt2);
结果如我所料:
index_newfmt1 = 0
index_newfmt1_ = 0
index_newfmt2 = 1