Otra de las mias
cuando quiero unir dos rutinas o mas no me funciona lo de rellenar con numeros aleatorios dentro del rango
se supone que este codigo al no haber mas numeros dentro del arreglo tomaria uno al azar dentro del rango establecido pero no se que pasa ahora que no lo hace
ReadOnly MAX As Integer = 99
Dim Rand As New Random
Dim ReAsult2255e As IEnumerable(Of Integer) =
(splits(1).Concat(splits(3).Concat(splits(5).
Distinct.
Select(Function(Value As Integer)
Return If(Value < MAX, Value, Rand.Next(1, MAX))
End Function))))
Dim seAlecctedValues231 As IEnumerable(Of Integer) = ReAsult2255e
Dim liste3 As List(Of Integer) = ReAsult2255e.Take(10).ToList
liste3.Sort()
ListBox12.Items.AddRange(liste3.Cast(Of Object).ToArray)
' ----------------------------------------------------------------------
Dim Rand1 As New Random
Dim AReAAsult2255e As IEnumerable(Of Integer) =
(splits(3).Concat(splits(10).Concat(splits(11).Concat(splits(12).
Distinct.
Select(Function(Value As Integer)
Return If(Value < MAX, Value, Rand1.Next(1, MAX))
End Function)))))
Dim seAlecctedValues231A As IEnumerable(Of Integer) = AReAAsult2255e
Dim listeA3 As List(Of Integer) = AReAAsult2255e.Take(10).ToList
listeA3.Sort()
ListBox13.Items.AddRange(listeA3.Cast(Of Object).ToArray)
Luis
No te funciona cómo esperas porque, en los dos casos que has mostrado, estás aplicando el
Distinct y el
Select solamente a la última concatenación, puesto que tienes las agrupaciones del
Concat abiertas:
Citar(splits(3).Concat(splits(10).Concat(splits(11).Concat(splits(12).
Distinct.
Select(Function(Value As Integer)
Return If(Value < MAX, Value, Rand1.Next(1, MAX))
End Function)))))
Para solucionarlo, simplemente fíjate mejor en las concatenaciones que haces en 'ReAsult2255e' y 'AReAAsult2255e', cierra las agrupaciones de ambos correctamente:
(splits(3).Concat(splits(10)).Concat(splits(11)).Concat(splits(12))).
Distinct.
Select(Function(value As Integer)
Return If(Value < MAX, Value, Rand1.Next(1, MAX))
End Function)
Se que no te gusta oir esto, pero es que no tendrías ese tipo de problemas si ordenases y estructurases mejor tú código, es un completo lio lo que tienes ...y lo sabes.
En mi opinión, lo mejor para ti es que fueses haciendo las cosas por partes, poco a poco, cómo en este ejemplo de abajo donde construyo la colección paso a paso,
haciendolo de esta manera te ayudarías a ti mismo a debuguear el código mejor, al poder recurrir/conocer facilmente el estado de la colección antes de hacerle una modificación (cómo la del
Select) para hacerle cambios con menos esfuerzo, y también reducir los errores que tienes de mal agrupamiento, o etc:
Dim concatCol As IEnumerable(Of Integer) = col1.Concat(col2)
Dim distinctCol As IEnumerable(Of Integer) = concatCol.Distinct
Dim selectCol As IEnumerable(Of Integer) = distinctCol.Select(Function(value As Integer)
If value < max Then
Return value
Else
Return rand.Next(1, max)
End If
End Function)
Saludos
Se que no te gusta oir esto, pero es que no tendrías ese tipo de problemas si ordenases y estructurases mejor tú código, es un completo lio lo que tienes ...y lo sabes.
Claro que si lo se, pero tengo una grave problema y es siempre la " P " prisa de ver cono funciona y siempre digo " despues lo ordeno " y asi vamos :( tengo que tratar de ser mas ordenado y valla tambien para los que estan aprendiendo a Programar es un sano consejo que nos da Elektro y se agradece :)
Luis
Sigo teniendo problemas con esto pense que lo podria resolver yo pero na :(
he probado a cambiar las declaraciones del rango max de estas formas pero no me me va y cuando algo hizo solo relleno con ceros ???
la funcion que uso no calcula una cantidad fija de numeros y dependiendo de eso, a veces va bien pero creo cuando se queda corto de cantidad de numeros me sale este error en tiempo de ejecucion
El valor no puede ser nulo.
Nombre del parámetro: second
ReadOnly MAX As Integer = 99 ( de cualquiera de las formas no hace nada )
Dim MAX As Integer = 99
Dim concatCol5 As IEnumerable(Of Integer) = splits(3).Concat(splits(13).Concat(splits(15)))
Dim distinctCol5 As IEnumerable(Of Integer) = concatCol5.Distinct
Dim selectCol5 As IEnumerable(Of Integer) = distinctCol5.Select(Function(value As Integer)
If value < MAX Then
Return value
Else
Return Rand.Next(1, MAX)
End If
End Function)
ListBox9.Items.AddRange(selectCol5.Cast(Of Object).ToArray)
Luis
Cita de: luis456 en 30 Marzo 2015, 18:42 PMEl valor no puede ser nulo.
Nombre del parámetro: second
El error es self-explanatory, se explica por si mismo, date cuenta, la segunda secuencia que estás intentando concatenar a la primera secuencia es una referencia nula (es decir, no se le ha asignado ningún valor, la colección no existe), puede ser una de las que he marcado en rojo:
Dim concatCol5 As IEnumerable(Of Integer) = splits(3).Concat(splits(13).Concat(splits(15)))(y además de eso no has corregido las agrupaciones cómo te dije en el comentario anterior, es decir, los paréntesis, aunque ese no es el motivo del error)
Cómo indica el mensaje de error, para corregirlo solo debes asegurarte de que la colección que le estás pasando al parámetro "second" de la función "concat" no sea una referencia nula.
revisa bien el resto del código, comprueba que
splits(13) y
splits(15) existan antes de intentar concatenarlos (
msgbox( splits(13) is nothing )), no te puedo ayudar a hallar el motivo ya que no forma parte del código que has mostrado.
Este ejemplo que puedes examinar, produce la misma excepción que has comentado, ya que la segunda colección es nula (no confundir con "vacía"
{} ):
Dim col1 As IEnumerable(Of String) = {}
Dim col2 As IEnumerable(Of String) ' = Nothing
Dim concatCol As IEnumerable(Of String) = Enumerable.Concat(first:=col1, second:=col2)
Saludos
A ver segun los calculos que me hace el programa sabes, me entrega cierta cantidad de numeros que varian desde ( 00 al 99 ) unas veces 50 o mas numeros otras 40 y ciertas ocasiones muchas menos y es aca cuando se produce el error, ya que como casi siempre estan por los 50 numeros no da problemas de este tipo ,solo cuando baja de esa cantidad y claro salta el error, ya que no hay numeros para llenar a splits(13) splits(15) pero mayormente no falla, lo que quiero es ver como suplir esos numeros que faltarian y dentro del rango ?
Luis
Estudiando el caso este descubri que la forma de que no me de error es mantener el arreglo dentro del minimo de registros que es de 35 registros por debajo de esa cantdad me produce el error, ahora lo que no tengo ni idea como hacerlo,se me ocurre con generar numeros aleaorios dentro el rango pero que no repitan con los de la variable ;(
luis
Para cerrar eseto , aca esta con lo que lo solucione ;) gracias a nuestro amigo elektro :silbar:
' aca esta para relleñar con ceros-----------
If Resultss.Count <35 Then
Resultss = Resultss.Concat(Enumerable.Repeat(Of Integer)(0, (35 - Resultss.Count)))
MsgBox(li.Count) '35
End If
Luis