Как сравнить IFormatProvider? - PullRequest
1 голос
/ 09 мая 2019

У меня есть Grid UserControl. Он использовал IFormatProvider для форматирования текста в ячейке для отображения. Каждая ячейка позволяет установить собственный IFormatProvider. По запросу DisplayText ячейки программа вызывает IFormatProvider ячейки, а затем IFormatProvider столбца по порядку. Я делаю массив для сохранения всех неидентичных IFormatProvider, так что мне просто нужно сохранить идентификатор для получения формата.

Как сравнить 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. Это функционирует или имеет лучший способ?

1 Ответ

0 голосов
/ 09 мая 2019

Примечание. Все типы, которые у меня есть для IFormatProvider, являются пользовательскими и реализуют .ToString, которые возвращают уникальные значения.Если это не так для вас, этот подход не будет работать.

После отладки я использовал .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
...