Получить предыдущий элемент словаря - PullRequest
1 голос
/ 17 января 2012

по нескольким причинам у меня есть Dictionary<string, string>, и я проверяю это в цикле foreach.У меня нет способа (по крайней мере, я не нашел умного решения) заменить его списком, массивом или Dictionary<int, string>.Словарь состоит из имени сервера, статуса пакета (2 строки).

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

Мой код:

foreach (KeyValuePair <string,string> pair in packageDistribution) { 
     if (pair.Value == "package distribution complete") { 
          // print pair.Key + " - Installed"; 
     } else {
         // print pair.Key + " - " + pair.Value
     } 
     if (i%3==0) "OR" (i== packageDistribution.count) { 
       // print the values \n 
     } 
}

Мне нужно сгруппировать их 3 на 3, чтобы сэкономить место, но моя проблема в том, что я хотел бы напечатать на новую строку, даже если текущий элемент отличается от предыдущего:

pair.Key.substring(0,4) != previousElement.substring(0,4)

Мои серверы выглядят как NLDN1234, NLDN1235, NSTM2345, NSTM9874, и я хотел бы сгруппировать их в зависимости от их имен.

У кого-нибудь есть разумное предложение?

Ответы [ 3 ]

2 голосов
/ 17 января 2012

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

Если они вам нужны в определенном порядке, вы должны явно отсортировать их, используя OrderBy(), и есливам нужно сгруппировать их, используйте GroupBy() ...

var groupsInOrder 
    = packageDistribution.GroupBy(p => p.Key.SubString(0,4))
        .OrderBy(g => g.Key);
foreach(var group in groupsInOrder)
{ 
    int index = 0;
    foreach(var pair in group)
    {
        // Handle item
        if (++index%3==0)
        {
            // New line
        }
    }
    // New line
}
0 голосов
/ 17 января 2012

Это должно быть намного проще,

 Dictionary<string, string> svrs = new Dictionary<string, string>();
            svrs.Add("NLDN1234", "ok");
            svrs.Add("NLDN1235", "ok");
            svrs.Add("NSTM2345", "ok");
            svrs.Add("NSTM9874", "ok");

            SortedDictionary<string, string> sortedSvrs = new SortedDictionary<string, string>(svrs);

            for (int i = 0; i < sortedSvrs.Keys.Count; i++)
            {
                var key = sortedSvrs.Keys.ElementAt(i);
                Console.WriteLine(key +" " + sortedSvrs[key]);
                // any extra operation
                //
            }
0 голосов
/ 17 января 2012

Разве вы не можете использовать традицию для цикла?

for(int i = 0; i < packageDistribution.Count; i++) {
    if(i != 0) {
        // check for packageDistribution at i against i-1
    }
}

Как-то так?

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