2009-12-04 4 views
2

У меня есть хэш-таблица, которую я хочу обновить со второй хэш-таблицы. Для любого из ключей, которые соответствуют, я хочу скопировать значение. Проблема в том, что когда я перечисляю ключи хеш-таблицы и пытаюсь отбросить каждую строку, я получаю исключение о литье указателя в строку. Ну, это строка, которую я хочу. Когда вы используете оператор индекса с чем-то вроде hashtable ["FirstName"], я ожидаю, что FirstName станет ключом. Он может использовать Guids под собой, но я должен вытащить строку для ключа, значение ключа.Как получить ключ записи Hashtable

private void UpdateSharePointFromInfoPath(Hashtable infopathFields) 
{ 
    // Go through all the fields on the infopath form 
    // Invalid Cast Exception Here 
    foreach (String fieldName in infopathFields.Keys) 
    { 
     // If the same field is on sharepoint  
     if (workflowProperties.Item.Fields.ContainsField(fieldName)) 
     { 
      // Update the sharepoint field with the new value from infopath 
      workflowProperties.Item[fieldName] = infopathFields[fieldName]; 
     } 
    } 
    // Commit the changes 
    workflowProperties.Item.Update(); 
} 

EDIT Я не создаю либо из этих хеш-таблицы. У ключей есть строки где-то, потому что я могу поместить имя поля следующим образом и получить значение поля. Я пытаюсь сделать сокращенный способ сделать следующее для каждого поля:

workflowProperties.Item["FirstName"] = infopathFields["FirstName"]; 
workflowProperties.Item["LastName"] = infopathFields["LastName"]; 
workflowProperties.Item["Address"] = infopathFields["Address"]; 
workflowProperties.Item["DOB"] = infopathFields["DOB"]; 
ect... 

EDIT Это было сказано, что Хеш использует Guids, но и, очевидно, имеет строку внутри еще я бы не стал уметь делать infopathFields ["FirstName"]. Это значение в строке, которую я прохожу туда, которую я хочу.

+0

Я не уверен, почему ваши гиды и строки смешиваются, но почему вы используете старый хашт способный класс, а не 2.0-и-выше словарь? –

+0

Я не создаю hashtables. –

+1

Я проголосовал за это, потому что я не ценю, что вы оскорбительные люди, которые пытались вам помочь. –

ответ

7

Каждый элемент является пара ключ/значение формата DictionaryEntry

foreach (DictionaryEntry de in infopathFields) 
     {   
      string fieldName = de.Key as string;   
       if (workflowProperties.Item.Fields.ContainsField(fieldName))   
       {   
        workflowProperties.Item[fieldName] = infopathFields[fieldName];   
       }  
     }  

     workflowProperties.Item.Update(); 
+0

Только то, что мне нужно. Пожелайте, чтобы некоторые из других попыток действительно прочитали вопрос перед ответом. Cheers –

+0

очень распространенная проблема здесь – harryovers

+0

Просто FYI, это будет игнорировать идентификаторы GUID, которые, согласно вашему вопросу, вы не хотели делать. Строка строки fieldName = de.Key как строка; будет иметь fieldName как null, если ключ имеет тип Guid. Затем оператор if возвращает false, а Guid игнорируется. Поэтому я не считаю это решение правильным. –

0

Что создает Hashtable? ключ на самом деле является объектом, поэтому он звучит так, как будто он не имеет никакого скрытого приведения в строку

0

Если тип значений infopathFields является Guid, то типы значений workflowProperties должны быть гидами. Я не вижу из фрагмента того, что определяется workflowProperties.

Чтобы преобразовать Guid в строку использовать Guid.ToString()

+0

Я как раз собирался опубликовать что-то в этих строках.Почти определенно ваш Hashtable использует GUID в качестве значения ключа –

0

Объекты, хранящиеся в хэш-таблице являются Guid объекты, так, чтобы получить строку, которую нужно вызвать ToString() на объект, который вы получаете от ключа переписчиком. Я бы также рекомендовал использовать общий класс Dictionary<K,V> вместо Hashtable, поскольку это будет ловить проблемы, подобные этому во время компиляции, а не во время выполнения.

+0

Я не создаю хеш-таблицы. Форма infopath выводит хеш-таблицу при ее отправке, а sharepoint предоставляет собственную хэш-таблицу для каждого элемента в списке, чтобы вы могли получить доступ к полям. –

1

Стандартная версия Hashtable может иметь разные ключи типа, поэтому большинство ваших ключей могут быть строками, но некоторые из ваших ключей могут быть идентификаторами GUID. Я готов поспорить, что это так и вызывает вашу проблему. Следующая небольшая консольная программа демонстрирует проблему.

static void Main(string[] args) 
    { 
     System.Collections.Hashtable htable = new System.Collections.Hashtable(); 
     htable.Add("MyName", "WindyCityEagle"); 
     htable.Add("MyAddress", "Here"); 
     htable.Add(new Guid(), "That Was My Guid"); 

     int loopCount = 0; 
     foreach (string s in htable.Keys) 
     { 
      Console.WriteLine(loopCount++.ToString()); 
      Console.WriteLine(htable[s]); 
     } 
    } 

Вы получите то же самое исключение, о котором вы сообщаете здесь.

Мое предложение, чтобы решить эту проблему было бы пойти со следующим

private void UpdateSharePointFromInfoPath(Hashtable infopathFields) 
{ 
    // Go through all the fields on the infopath form 
    // Invalid Cast Exception Here 
    foreach (object key in infopathFields.Keys) 
    { 

     string wfpKey = key.ToString(); 
     // If the same field is on sharepoint  
     if (workflowProperties.Item.Fields.ContainsField(wfpKey)) 
     { 
      // Update the sharepoint field with the new value from infopath 
      workflowProperties.Item[wfpKey] = infopathFields[key]; 
     } 
    } 
    // Commit the changes 
    workflowProperties.Item.Update(); 
} 
+0

Если объект, выходящий из .Keys, является директивой, а затем, перебрасывая его в строку, просто даст мне Guid в строчном формате. –

0

Чтобы получить наибольшее целое ключ из хэш-таблицы :

public class Example 
{ 
    public void hashTableMethod() 
    { 
     Hashtable ht = new Hashtable(); 
     ht.Add(5002894, "Hemant Kumar"); 
     ht.Add(5002895, "Himanshee Ratnakar"); 
     ht.Add(5002896, "Pooja Bhatnagar"); 
     ht.Add(5002897, "Hina Saxena"); 
     ht.Add(5002898, "Kanika Aneja"); 
     ht.Add(5002899, "Hitesh Chaudhary"); 

     Console.Write("\nNumber of Key-Value pair elements in HashTable are : {0}",ht.Count); 
     Console.WriteLine("Elements in HashTable are: "); 
     ICollection htkey = ht.Keys; 
     foreach (int key in htkey) 
     { 
      Console.WriteLine("{0}. {1}",key,ht[key]); 
     } 
     string ch="n"; 
     do 
     { 
      Console.Write("\n\nEnter the name to check if it is exist or not, if not then it will add: "); 
      string newName=Console.ReadLine(); 
      if(ht.ContainsValue(newName)) 
      { 
       Console.Write("\nYour Name already Exist in the list!!"); 
      } 
      else 
      { 
       Console.Write("\nSorry that name doesn't exist but it will be added!!"); 
       int getKey = 0; 

       int[] htk= new int[ht.Count]; 
       ht.Keys.CopyTo(htk,0); 

       string[] val=new string[ht.Count]; 
       ht.Values.CopyTo(val,0); 

       Array.Sort(htk,val); 
       foreach (int id in htk) 
       { 
        getKey = id; 
       } 
       ht.Add(getKey+1,newName); 
      } 
      Console.Write("\nDo you want to search more??(y/n) :"); 
      ch=Console.ReadLine(); 
     }while(ch=="y"||ch=="Y"); 

     Console.Write("\nNew List Items: \n"); 
     ICollection htkeys = ht.Keys; 
     foreach (int key in htkeys) 
     { 
      Console.WriteLine("{0}. {1}",key,ht[key]); 
     } 
    } 
}