Сравните значения двух хеш-таблиц в цикле - PullRequest
0 голосов
/ 16 декабря 2011

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

       HashTable OldTable= new HashTable();

        OldTable.Add("Date of Event", OCEFData.EventDate);
            OldTable.Add("Angina Status", OCEFData.AnginaStatusValue);
            OldTable.Add("Please indicate the body system involved (tick all that apply)",strBodySystem.ToString());
            OldTable.Add("If Unstable Angina, define Braunswald Classification", OCEFData.UnstableAnginaValue);
            OldTable.Add("If Stable Angina", OCEFData.StableAnginaValue);
            OldTable.Add("Details of method of Documentation of Angina", OCEFData.AnginaDocDetails);
            OldTable.Add("INFORM TO SPONSOR", (OCEFData.IsInformed)?"Yes":"No");
            OldTable.Add("DATE OF INFORMATION TO SPONSOR ", OCEFData.SponsorDate);
            OldTable.Add("DATE OF INFORMATION TO INSTITUTIONAL ETHICS COMMITTEE", OCEFData.EthicsCommitteeDate);
            OldTable.Add("DATE OF INFORMATION TO LICENSING AUTHORITY", OCEFData.LicensingAuthority);



       HashTable NewTable= new HashTable();

       NewTable.Add("Date of Event", OCEFData.EventDate);
        NewTable.Add("Angina Status", OCEFData.AnginaStatusValue);
        NewTable.Add("Please indicate the body system involved (tick all that apply)", strBodySystem.ToString());
        NewTable.Add("If Unstable Angina, define Braunswald Classification", OCEFData.UnstableAnginaValue);
        NewTable.Add("If Stable Angina", OCEFData.StableAnginaValue);
        NewTable.Add("Details of method of Documentation of Angina", OCEFData.AnginaDocDetails);
        NewTable.Add("INFORM TO SPONSOR", (OCEFData.IsInformed)?"Yes":"No");
        NewTable.Add("DATE OF INFORMATION TO SPONSOR ", OCEFData.SponsorDate);
        NewTable.Add("DATE OF INFORMATION TO INSTITUTIONAL ETHICS COMMITTEE", OCEFData.EthicsCommitteeDate);
        NewTable.Add("DATE OF INFORMATION TO LICENSING AUTHORITY", OCEFData.LicensingAuthority);

Ответы [ 4 ]

1 голос
/ 16 декабря 2011

Это так, как вы хотите?

Hashtable OldTable = new Hashtable();
Hashtable NewTable = new Hashtable();

        foreach (DictionaryEntry entry in OldTable)
        {
            if(NewTable.ContainsKey(entry.Key))
            {
                //Do something?
            }
        }
0 голосов
/ 16 декабря 2011

Во-первых, используйте напечатанный Dictionary<TKey, TValue> вместо Hashtable, ниже приведен пример, когда значения имеют тип string, это будет легко изменить string на ваш пользовательский тип (я думаю, enum или уже строка константы).

IDictionary<string, string> map1 = new Dictionary<string, string>
                                        {
                                            {"A", "M1-A"},
                                            {"B", "M1-B"},
                                            {"C", "M1-C"}
                                        };

IDictionary<string, string> map2 = new Dictionary<string, string>
                                        {
                                            {"A", "M2-A"},
                                            {"B", "M2-B"},
                                            {"D", "M2-D"}
                                        };

.NET 3.5 и выше : использовать LINQ Intersect()

var items = map1.Keys.Intersect(map2.Keys)
                     .Select(k => map1[k] + " / " + map2[k])
                     .ToList();

<. NET 3,5 </strong>

IList<string> results = new List<string>();
foreach (var key in map1.Keys)
{
    if (map2.ContainsKey(key))
    {
        results.Add(map1[key] + " / " + map2[key]);
    }
}

OUTPUT:
M1-A / M2-A
M1-B / M2-B
0 голосов
/ 16 декабря 2011

Предполагая, что вы пытаетесь сопоставить ключи в обоих HashTable ... вы можете сделать как

 foreach (string key in oldtable.Keys)
    {
        if (newtable.Contains(key))
        {
            // do your work;
        }
        else
        {
            // do your work;         
       }
    }
0 голосов
/ 16 декабря 2011

Вы можете использовать Linq для пересечения ключей, давая вам набор ключей в обеих таблицах?

var combinedKeys=OldTable.Keys.Cast<string>().Intersect(NewTable.Keys.Cast<string>())

затем вы можете перебирать ключи или использовать оператор Linq Select или Agregate, чтобы получить результат сбора.

РЕДАКТИРОВАТЬ

Поскольку HashTable не является строго типизированным, Keys не дает вам IEnumerable, поэтому вызов Cast<string>() для получения IEnumerable<string>

Если бы вы использовали строго типизированный Dictionary<string,string>, вам бы не понадобилась часть Cast<string>().

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