listas - Seleccionar elementos únicos de una lista en C#
listas c++ insertar (9)
Creo que Matt quiso decir:
static IEnumerable<T> GetUniques<T>(IEnumerable<T> things)
{
Dictionary<T, bool> uniques = new Dictionary<T, bool>();
foreach (T item in things)
{
if (!(uniques.ContainsKey(item)))
{
uniques.Add(item, true);
}
}
return uniques.Keys;
}
¿Cómo selecciono los elementos únicos de la lista {0, 1, 2, 2, 2, 3, 4, 4, 5}
para obtener {0, 1, 3, 5}
, eliminando de manera efectiva todas las instancias de la repetición elementos {2, 4}
?
Si Linq no está disponible para usted porque tiene que admitir el código heredado que no se puede actualizar, entonces declare un Diccionario, donde el primer int es el número y el segundo int es el número de ocurrencias. Pasa por tu lista, cargando tu diccionario. Cuando haya terminado, recorra su diccionario seleccionando solo aquellos elementos donde el número de ocurrencias es 1.
var nums = new int{ 0...4,4,5};
var distinct = nums.Distinct();
asegúrese de estar usando Linq y .NET framework 3.5.
Con lambda ...
var all = new[] {0,1,1,2,3,4,4,4,5,6,7,8,8}.ToList();
var unique = all.GroupBy(i => i).Where(i => i.Count() == 1).Select(i=>i.Key);
En .Net 2.0 estoy bastante seguro de esta solución:
public IEnumerable<T> Distinct<T>(IEnumerable<T> source)
{
List<T> uniques = new List<T>();
foreach (T item in source)
{
if (!uniques.Contains(item)) uniques.Add(item);
}
return uniques;
}
Hay muchas maneras de despellejar a un gato, pero HashSet parece hecho para la tarea aquí.
var numbers = new[] { 0, 1, 2, 2, 2, 3, 4, 4, 5 };
HashSet<int> r = new HashSet<int>(numbers);
foreach( int i in r ) {
Console.Write( "{0} ", i );
}
La salida:
0 1 2 3 4 5
C # 2.0 solución:
static IEnumerable<T> GetUniques<T>(IEnumerable<T> things)
{
Dictionary<T, int> counts = new Dictionary<T, int>();
foreach (T item in things)
{
int count;
if (counts.TryGetValue(item, out count))
counts[item] = ++count;
else
counts.Add(item, 1);
}
foreach (KeyValuePair<T, int> kvp in counts)
{
if (kvp.Value == 1)
yield return kvp.Key;
}
}
Aquí hay otra manera que funciona si tiene objetos de tipo complejo en su Lista y desea obtener los valores únicos de una propiedad:
var uniqueValues= myItems.Select(k => k.MyProperty)
.GroupBy(g => g)
.Where(c => c.Count() == 1)
.Select(k => k.Key)
.ToList();
O para obtener valores distintos:
var distinctValues = myItems.Select(p => p.MyProperty)
.Distinct()
.ToList();
Si su propiedad también es un tipo complejo, puede crear un comparador personalizado para Distinct (), como Distinct (OrderComparer), donde OrderComparer podría verse así:
public class OrderComparer : IEqualityComparer<Order>
{
public bool Equals(Order o1, Order o2)
{
return o1.OrderID == o2.OrderID;
}
public int GetHashCode(Order obj)
{
return obj.OrderID.GetHashCode();
}
}
var numbers = new[] { 0, 1, 2, 2, 2, 3, 4, 4, 5 };
var uniqueNumbers =
from n in numbers
group n by n into nGroup
where nGroup.Count() == 1
select nGroup.Key;
// { 0, 1, 3, 5 }