Как получить ключ записи Hashtable - PullRequest
3 голосов
/ 04 декабря 2009

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

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"]. Это значение в строке, которую я передаю туда, которое я хочу.

Ответы [ 6 ]

9 голосов
/ 04 декабря 2009

Каждый элемент является парой ключ / значение в формате 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();
1 голос
/ 04 декабря 2009

Стандартная версия 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 голосов
/ 04 ноября 2015

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

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]);
        }
    }
}
0 голосов
/ 04 декабря 2009

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

0 голосов
/ 04 декабря 2009

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

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

0 голосов
/ 04 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...