2

データリーダーからの値で辞書を埋めるには、次の方法があります。データリーダーフィールドとメソッドに渡されるプロパティの間にケースの不一致がある可能性があります。次の方法では、この問題に対処するために、最初にプロパティを小文字に変換しています。これにより、2つの辞書が作成されます。1つの辞書でこれを達成するためのより良い方法はありますか?

private Dictionary<string, object> FillDictionaryWithReaderValues(List<string> propertiesOfAllEntities, IDataReader reader)
{
   Dictionary<string, object> lowerCaseDictionary = new Dictionary<string, object>();
   Dictionary<string, object> propertyResultList = new Dictionary<string, object>();

   foreach (var item in propertiesOfAllEntities)
   {
      lowerCaseDictionary.Add(item.ToLower(), null);
   }

   for (int i = 0; i < reader.FieldCount; i++)
   {
      lowerCaseDictionary[reader.GetName(i).ToLower()] = reader[i];
   }

   foreach (var item in propertiesOfAllEntities)
   {
      propertyResultList.Add(item, lowerCaseDictionary[item.ToLower()]);
   }

   return propertyResultList;
}
4

2 に答える 2

7

の大文字と小文字を無視できます。を受け入れるオーバーロードコンストラクタがありDictionary、キーの大文字と小文字を区別するために使用します。DictionaryIEqualityComparerStringComparer.InvariantCultureIgnoreCase

var dic = 
      new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);

したがって、コードには、大文字と小文字を区別しない辞書が1つだけあれば十分です。

于 2012-11-06T08:25:16.290 に答える
1

@CuongLeに感謝します。以下が気に入った場合は、@CuongLeの回答に賛成してください。

他の人の利益のために、私はここに答えを書きます:

    private Dictionary<string, object> FillDictionaryWithReaderValues(List<string> propertiesOfAllEntities, IDataReader reader)
    {

        Dictionary<string, object> propertyResultList = new Dictionary<string, object>(StringComparer.InvariantCultureIgnoreCase);
        for (int i = 0; i < reader.FieldCount; i++)
        {
            string readerFieldName = reader.GetName(i);
            //Whether propertiesOfAllEntities.Contains the property
            if (propertiesOfAllEntities.FindIndex(x => x.Equals(readerFieldName, StringComparison.OrdinalIgnoreCase)) != -1)
            {
                propertyResultList.Add(readerFieldName, reader[i]);
            }

        }

        return propertyResultList;
    }

参照:

  1. 大文字と小文字を区別しないリスト検索
于 2012-11-06T09:10:58.087 に答える