Повторяющиеся строки, добавляемые в сетку данных при добавлении в цикл for - PullRequest
0 голосов
/ 01 сентября 2018

Когда я выводю сгенерированное значение в сетку данных, оно помещает это значение примерно 15 раз, прежде чем добавить уникальное значение в сетку данных. Кто-нибудь знает какие-либо решения или обходные пути к этой проблеме? Также обратите внимание, что я запускаю этот цикл for внутри другого цикла for, чтобы сгенерировать определенное количество значений.

   var parts = new List<string>();
            string hash = CalculateMD5Hash(identifier);
            for (var i = 0; i < 32; i += 2)
            {
                string chars = "0123456789ABCDEFGHJKLMNPQRTUVWXY";
                var nextDigit = Convert.ToInt32(hash.Substring(i, 2), 16) & 31;
                var withDash = (((i % 8) == 0) && (i > 0));


                parts.Add(withDash ? "-" : "");
                parts.Add(chars.Substring(nextDigit, 1));




            }
            string[] array = parts.ToArray();
            string joined = string.Join("", array);

            string output = identifier + ":" + joined;
            string[] keySplit = output.Split(':');

            outputGrid.Rows.Add(keySplit[0], keySplit[1]); //Outputs mulitple times

1 Ответ

0 голосов
/ 02 сентября 2018

Вместо генерации нескольких случайных классов лучше практиковать использование одного случайного класса, так как есть вероятность, что случайные классы могут иметь одинаковое начальное число и генерировать одинаковые числа. Это связано с тем, что он использует часы для создания начального числа и в цикле, где между каждой инициализацией может не быть много времени, несколько классов будут иметь одинаковое значение случайного начального числа и производить одинаковый набор «случайных» чисел, следовательно, один и тот же идентификатор генерируется несколько раз. Инициализация одного случайного класса устранит этот риск.

private static readonly Random generator = new Random(); 
private static readonly object syncLock = new object(); 
public static int RandomNumber(int min, int max)
{
    lock(syncLock) {
        return generator.Next(min, max); 
       }
 }

А в вашем GenId() методе:

string digiList = "0123456789";
string alphaList = "ABCDEFGHIJKLMNOPQRSTUVWXY";

  string id = digiList[randomNumber(0, digiList.Length)].ToString();
   id += alphaList[randomNumber(0, alphaList.Length)].ToString();
   id += alphaList[randomNumber(0, alphaList.Length)].ToString();
   id += digiList[randomNumber(0, digiList.Length)].ToString();
   id += digiList[randomNumber(0, digiList.Length)].ToString();

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