Hola a todos
bueno aca estoy de nuevo :) con mis rollos
no encuentro la manera de eliminar datos repetidos he puesto por todos lados pero no me filtra los registros repetidos se como hacerlo con variables pero como aca pongo todas las variables juntas en un testbox ;( me da ese fallo
01 02 03 04 05 06 07 08 09
01 02 03 04 05 06 07 08 09
Dim Lnumbers As List(Of IEnumerable(Of Integer)) = { SM18, SM17, SM16, SM14....,}.Distinct.ToList
For Each col As IEnumerable(Of Integer) In Lnumbers
ListBox23.Items.Add(String.Join(", ", From value As Integer In col
Select If(value.ToString.Length = 1I,
value.ToString.Insert(0I, "0"c),
value.ToString)))
Next col
Luis
Una forma de hacerlo sería utilizando la clausura Where para evaluar si la colección contiene el mismo elemento más de una vez, otra forma sería utilizar la clausura Group By para agrupar por números y luego seleccionar el primer elemento de la agrupación (Enumerable.First) con la claúsura Select (evitando así duplicados).
➢ Where Clause (Visual Basic) - MSDN (https://msdn.microsoft.com/en-us/library/bb384663.aspx)
➢ Group By Clause (Visual Basic) - MSDN (https://msdn.microsoft.com/en-us/library/bb531412.aspx)
Saludos
Cita de: Eleкtro en 27 Abril 2015, 16:37 PM
Una forma de hacerlo sería utilizando la clausura Where para evaluar si la colección contiene el mismo elemento más de una vez, otra forma sería utilizar la clausura Group By para agrupar por números y luego seleccionar el primer elemento de la agrupación (Enumerable.First) con la claúsura Select (evitando así duplicados).
➢ Where Clause (Visual Basic) - MSDN (https://msdn.microsoft.com/en-us/library/bb384663.aspx)
➢ Group By Clause (Visual Basic) - MSDN (https://msdn.microsoft.com/en-us/library/bb531412.aspx)
Saludos
Hola corrigeme en algo. tendria que pasar el contenido del tesbox a una variable para poder hacer el filtrado ?
luis
Tienes que modificar la query de LINQ que estás utilizando en el código de arriba, pero añadiéndole las clausulas necesarias para evitar duplicados.
Es facil. En las urls que te mostré tienes ejemplos.
Sigo sin ver que lo hayas intentado.
Saludos
"Sigo sin ver que lo hayas intentado ".
No es eso es que estoy pasando unas formulas jejej y he ido de pasada, no he tenido tiempo de miralo con detenimiento ahora estoy mas urgido de pasar esas formulas que tienen que ver con la pregunta pero primero acabare pasarlas :)
luis
Bueno creo que solo naci para las tuercas ;)
trato con los ejemplos que hay en las paginas de msdn que me pasaste pero aparte que no hablo chino jeje tengo que usar el traductor que habla como indio y me enredo mas y estos ejemplos estan orientados a bases de datos y mas me enrollo jejej.
Public Class Form1
' eliminar registros iguales en " Lnumbers "
' eliminar registros MENORES a MAX
' En este codigo deberia quedar un solo registro de los cuatro
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
Dim MAX As Integer = 10
Dim Lnumbers As List(Of IEnumerable(Of Integer)) = {col1, col2, col3, col4}.ToList
For Each col As IEnumerable(Of Integer) In Lnumbers
ListBox1.Items.Add(String.Join(", ", From value As Integer In col
Select If(value.ToString.Length = 1I,
value.ToString.Insert(0I, "0"c),
value.ToString)))
Next col
'***********************aca me tranco
Dim concatCol As IEnumerable(Of Integer) = Lnumbers
Dim distinctCol As IEnumerable(Of Integer) = concatCol
Dim selectCol As IEnumerable(Of Integer) = distinctCol.Select(Function(value As Integer)
If value = MAX Then
Return value
Else
Return value
End If
End Function)
ListBox2.Items.AddRange(selectCol.Cast(Of Object).ToArray)
End Sub
End Class
AAAAAAAAAAAAAAAAAA
TAMPOCO
Dim products = Lnumbers
Dim cat = From value In products _
Select value _
Distinct
For Each n In cat
ListBox2.Items.Add(String.Join(", ", From value As Integer In n
Select If(value.ToString.Length = 1I,
value.ToString.Insert(0I, "0"c),
value.ToString)))
Next
Bueno consegui solucionar uno de los problemas :) y es eliminar del listbox los repetidos pero los completos o sea los que tienen 10 registros ;( alguien se anima a mejorarlo para que no me queden a si
02 03 05
01 02 03 04 05
02 05 06 07 0 9
y me deje solo los registros completos ?
Public Class Form1
' eliminar registros iguales en " Lnumbers " lo solucione quitandolos del listxbo
' eliminar registros MENORES a MAX
' En este codigo deberia quedar un solo registro de los cuatro
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
Dim MAX As Integer = 10
Dim Lnumbers As List(Of IEnumerable(Of Integer)) = {col1, col2, col3, col4}.ToList
For Each col As IEnumerable(Of Integer) In Lnumbers
ListBox1.Items.Add(String.Join(", ", From value As Integer In col
Select If(value.ToString.Length = 1I,
value.ToString.Insert(0I, "0"c),
value.ToString)))
Next col
End Sub
'*****************************************preubas**********
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' Le pasa el Listbox a la función
MsgBox(Eliminar(ListBox1), _
MsgBoxStyle.Information, _
"Elementos duplicados en el List ")
End Sub
Function Eliminar(ByVal LB As ListBox) As Int32
Dim i As Int32
Dim j As Int32
Dim n As Int32
' Recorre los items ( copara empezando _
'desde el primero , de abajo hacia arriba)
For i = 0 To LB.Items.Count - 2
For j = LB.Items.Count - 1 To i + 1 Step -1
' verifica si es el mismo
If LB.Items(i).ToString = LB.Items(j).ToString Then
' elimina el elemento indicando el índice
LB.Items.RemoveAt(j)
n += 1 'lleva la cuenta de los duplicados
End If
Next
Next
Return n ' retorna los eliminados
End Function
End Class
los ejemplos (los 100) ;) no me aclaran nada
Luis
Especifica claramente lo de los duplicados, dices que en este ejemplo solo debe quedar una secuencia (o eso entiendo por "registro"), ¿cual?, y ¿por qué?.
CitarDim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
¿Quieres dscartar los valores duplicados entre cada decuencia?, ¿o quieres descartar la secuencia entera en caso de que algún valor esté repetido con los valores de otra de las secuencias?, por que ambas cosas son muy distintas.
Da más detalles
Saludos
Cita de: Eleкtro en 30 Abril 2015, 20:39 PM
Especifica claramente lo de los duplicados, dices que en este ejemplo solo debe quedar una secuencia (o eso entiendo por "registro"), ¿cual?, y ¿por qué?.
¿Quieres dscartar los valores duplicados entre cada decuencia?, ¿o quieres descartar la secuencia entera en caso de que algún valor esté repetido con los valores de otra de las secuencias?, por que ambas cosas son muy distintas.
Da más detalles
Saludos
eliminar de la lista los resultados como te muestro
01, 03, 04, 05, 06, 08<----X
01, 03, 04, 05, 06, 08 <----repite con el anterior
01, 03, 04, 05, 09, 30
01, 03, 04, 05, 30, 30 <----X
01, 03, 04, 05, 30, 40 <----repite con el anterior
01, 03, 04, 05, 30, 40 <----repite con el anterior
01, 03, 04, 06, 07 <--------no llega a la cantidad
01, 03, 04,<----------------no llega a la cantidad
01, 03, 04, 06, 08, 09
01, 03, 04, 06, 08, 27
01, 03, 04, 06, 08, 49
01, 03, 04, 06, 12<--------no llega a la cantidad
es eliminar los que sean iguales claro esta dejando uno solo de los que repiten :)
y los que no llegan a tener la cantida establecida eliminarlos.
aca van dos numeros estos si eliminar ya que son iguales en todo Y dejar un solo registro
01, 03, 04, 05, 30, 40 <----
01, 03, 04, 05, 30, 40 <----repite con el anterior
estos dejar ya que son diferentes aunque sea un solo numero
01, 03, 04, 05, 30, 40
01, 03, 04, 05, 30, 80
eliminar repetidos y que no cumplan la cantida establecida que seria MAX=10
repito la pregunta:
CitarDices que en este ejemplo solo debe quedar una secuencia (o eso entiendo por "registro"), ¿cual?, y ¿por qué?.
No se si esto produce el resultado que esperas:
Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11}
Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
Dim max As Integer = 10
Dim cols As IEnumerable(Of IEnumerable(Of String)) =
From col As IEnumerable(Of Integer) In {col1, col2, col3, col4}
Group By String.Join("", col).AsEnumerable
Into Group
Select From value As Integer In Group.First.Distinct
Where Not (value > max)
Select value.ToString(format:="0#")
ListBox1.Items.AddRange((From col As IEnumerable(Of String) In cols Select String.Join(", ", col)).ToArray)
Resultado de ejecución:
01, 05, 06, 07, 08, 09, 10
01, 02, 08, 06, 09
02, 03
Saludos
Bueno si y no jejje
a si es ahora como entrega los resultados
01, 05, 06, 07, 08, 09, 10 ,20 ,80, 88
01, 02, 08, 06, 09 <-----eliminar ya que tiene que tener 10 numeros
02, 03<-------------------eliminar ya que tiene que tener 10 numeros
pero debe solo quedar asi , solo los registros completos que cumplan la condicion de 10 registros ( disculpas no habia contado bien jeje)
01, 05, 06, 07, 08, 09, 10,20,80,88
Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11, 15, 80}
Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11, 85}
Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
Dim MAX As Integer = 10
Gracias :)
Luis
Cita de: luis456 en 1 Mayo 2015, 07:01 AM01, 02, 08, 06, 09 <-----eliminar ya que tiene que tener 10 numeros
02, 03<-------------------eliminar ya que tiene que tener 10 numeros
Entendí que el "10", es decir esa variable "max" era con la intención de limitar los valores, no la cantidad de valores por secuencia.
Solo debes evaluar el valor de la función
Enumerable.Count() usando la clausula
WHERE en la misma query que te he mostrado.
➢
Enumerable.Count() - MSDN (https://msdn.microsoft.com/en-us/library/vstudio/bb338038%28v=vs.100%29.aspx)
Cita de: MSDNReturns the number of elements in a sequence.
...y eliminar esto que yo escribí, claro está:
Citar...
Where Not (value > max)
...
Creo que eres capaz de corregirlo pero por si acaso te doy una pista, ese
WHERE que he citado tienes que eliminarlo,
no reemplazarlo, el
WHERE que tu tienes que añadir debe ir en otro lugar.
Saludos
Hola con pistas tampoco doy porque he mirado le que hay en msd y no se como contar o mirar dentro de los col1 ,col2... que estan a su ves en el grupo cols
ya que si hago esta (prueba) me cuenta es el total de col y no los que estan dentro de col1
' eliminar registros iguales en " Lnumbers " lo solucione quitandolos del listxbo
' eliminar registros MENORES a MAX
' En este codigo deberia quedar un solo registro de los cuatro
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim col1 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11, 15, 80}
Dim col2 As IEnumerable(Of Integer) = {1, 5, 6, 7, 8, 9, 10, 11, 85}
Dim col3 As IEnumerable(Of Integer) = {1, 2, 8, 6, 9}
Dim col4 As IEnumerable(Of Integer) = {2, 2, 3}
Dim MAX As Integer = 10
Dim cols As IEnumerable(Of IEnumerable(Of String)) =
From col As IEnumerable(Of Integer) In {col1, col2, col3, col4}
Group By String.Join("", col).AsEnumerable
Into Group
Select From value As Integer In Group.First.Distinct
Where Not (value = MAX)
Select value.ToString(format:="0#")
ListBox1.Items.AddRange((From col As IEnumerable(Of String) In cols Select String.Join(", ", col)).ToArray)
'*****************************************preubas**********------------------------------------------------
Dim cuenta As Integer = cols.Count()
MsgBox(cols.Count) lleva cuatro bien
MsgBox(col1.Count) lleva 10 numeros bien
MsgBox(col2.Count) lleva 9 mal eliminar
luis
Cita de: luis456 en 1 Mayo 2015, 16:35 PMcon pistas tampoco
Dim cuenta As Integer = cols.Count()
MsgBox(cols.Count) lleva cuatro bien
MsgBox(col1.Count) lleva 10 numeros bien
MsgBox(col2.Count) lleva 9 mal eliminar
Eso no es lo que te expliqué que debes hacer, solo tienes que utilizar ese
cols.Count() en la query de LINQ que te mostré y que ya te lo mencioné...
Cita de: luis456 en 1 Mayo 2015, 16:35 PMno se como contar o mirar dentro de los col1 ,col2... que estan a su ves en el grupo cols
Con la claúsula WHERE.
From col As IEnumerable(Of Integer) In {col1, col2, col3, col4}
Where (col.Count() <= Max)
Group By...
...
¿Ves cómo era muy facil?.
Saludos
:rolleyes: :rolleyes: :rolleyes: es que la duda que tenia era con la logica ;( si col tiene la coleccion completa de col1,,etc era como contaria los numeros de col1 ??? bueno creo me entiendes , lo bueno es que por fin pude consultar los 100 ejemplos de linq: que me pasaste en su dia :) y ahora preguntare menos jejejje (espero :( ) vi muchas rutinas que me hacen falta ;)
Gracias :)
Luis