2009-07-22 6 views
1

Ho dois-je aller à ajouter à la colonne minutes au hasard dans les données, voici mon code:minutes au hasard en C# 2.0

protected void btnUpdateTable_Click(object sender, EventArgs e) 
{ 


    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     ///check if column[logout] is null or empty, fill it 
     if(dr.IsNull("logout_time")) 
     { 
      ///get the login colum datetime 
      /// add random datetime to it 
      if (!dr.IsNull("login_time")) 
      { 
       DateTime dt = Convert.ToDateTime(dr["login_time"]); 
       dt = dt.AddMinutes(?);/// "?"<--here I want to add random minutes 
      }    
     } 
    } 

Toute aide grandement appréciée.

Merci à tous pour l'aide, voici mon dernier extrait de code:

foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     ///check if column[logout] is null or empty, fill it 
     if(dr.IsNull("logout_time")) 
     { 
      ///get the login colum datetime 
      /// add random datetime to it 
      if (!dr.IsNull("login_time")) 
      { 
       DateTime dt = Convert.ToDateTime(dr["login_time"]); 
       Random rand = new Random(); 
       //return random.Next(0, 59); 
       dt = dt.AddMinutes(rand.Next(0,59)); 
       dt = dt.AddSeconds(rand.Next(0, 59)); 
       dr["logout_time"] = dt; 

      } 

     } 
    } 
+0

Dans la gamme 0-59? –

+0

* * * Comme mentionné ci-dessous, il est essentiel de placer la ligne 'Random rand = new Random()' en dehors de votre boucle foreach. Sinon, vous obtiendrez probablement une séquence de minutes comme '(42, 42, 42, 27, 27 ...)', car Random est ensemencé par l'heure du système. –

+1

En outre, les instructions 'rand.Next (0, 59)' doivent être 'rand.Next (0, 60)' car la limite supérieure de 'Random.Next()' est exclusive. Cela vous donnera la plage '0-59' désirée. Sinon, ça va bien! –

Répondre

11

Vous pouvez utiliser ceci:

Random random = new Random(); 

foreach(DataRow dr ...) 
{ 
    int rand = random.Next(0, 60); 
} 

Comme un commentaire fait remarquer, vous n Vous n'avez pas besoin de créer un nouvel objet aléatoire pour chaque numéro que vous souhaitez créer. (En fait, vous ne devriez probablement pas).

+3

Hmm. Créer un nouveau Random every call? Ce n'est pas une bonne idée, car en situation de stress, il se peut qu'il finisse deux fois avec la même graine. Pas si aléatoire. – spender

+2

Kevin ne précise pas si c'est à l'intérieur ou à l'extérieur de 'foreach' ... donnez une pause à l'homme! –

+2

Bien sûr, mais vaut la peine de renforcer néanmoins – spender

7

Essayez d'utiliser Random:

Random randGen = new Random(); 

foreach (DataRow dr in ds.Tables[0].Rows) 
{ 
    ///check if column[logout] is null or empty, fill it 
    if(dr.IsNull("logout_time")) 
    { 
     ///get the login colum datetime 
     /// add random datetime to it 
     if (!dr.IsNull("login_time")) 
     { 
      DateTime dt = Convert.ToDateTime(dr["login_time"]); 
      dt = dt.AddMinutes(randGen.Next(0, 60)); 
      /// "?"<--here I want to add random minutes 
     }    
    } 
} 
+0

+1 pour une meilleure utilisation de Random – spender

+0

Merci ... pense que c'est la même chose que celle de Kevin ಠ_ಠ –

+1

La limite supérieure de 'Random.Next' est exclusive, donc pour obtenir un nombre de 0 à 59, l'appel devrait être' random.Next (0, 60) ' –

3

En supposant que vous ne voulez pas que votre objet dt pour obtenir déplacé dans la prochaine heure (par exemple, vous voulez tout moment 8:00-8:59 pour obtenir déplacé jusqu'à 08h59 au plus), je suggère les modifications suivantes:

protected void btnUpdateTable_Click(object sender, EventArgs e) 
{ 
    Random rand = new Random; 

    foreach (DataRow dr in ds.Tables[0].Rows) 
    { 
     ///check if column[logout] is null or empty, fill it 
     if(dr.IsNull("logout_time")) 
     { 
      ///get the login colum datetime 
      /// add random datetime to it 
      if (!dr.IsNull("login_time")) 
      { 
       DateTime dt = Convert.ToDateTime(dr["login_time"]); 
       dt = dt.AddMinutes(rand.Next(0, (60 - dt.Minutes))); 
      }    
     } 
    } 
} 
+0

C'est un ajout réfléchi ... J'aimerais que la question soit un peu plus précise! –

0

s'il vous plaît noter également que deux instructions if dans l'autre peuvent être optimisés pour:

protected void btnUpdateTable_Click(object sender, EventArgs e) { 
    foreach (DataRow dr in ds.Tables[0].Rows) 
     if(dr.IsNull("logout_time") && !dr.IsNull("login_time")) { 
      DateTime loginTime = Convert.ToDateTime(dr["login_time"]); 
      loginTime = loginTime.AddMinutes(new Random().Next(0,59)); 
     } 
} 
+0

Vous ne devriez pas utiliser 'new Random()' dans une boucle comme celle-ci, sinon vous la créerez avec la même valeur en millisecondes produisant continuellement le même nombre pour environ 10-20 itérations –

+0

Un exemple en C# 3.0: 'Enumerable. Range (1, 1000) .Sélectionner (i => nouveau Random(). Next()). ToList(). ForEach (Console.WriteLine); ' –

+0

merci pour l'aide, ne voulait pas utiliser" et "condition chaque temps – Developer

Questions connexes