valor vacia una seleccionar sacar recorrer objetos metodos los listas lista filtrar datos crear como c# list distinct linq-to-objects

vacia - recorrer list c#



Seleccionar distintas por dos propiedades en una lista (5)

Tengo una list<message> que contiene propiedades de tipo Guid y DateTime (así como otras propiedades). Me gustaría deshacerme de todos los elementos de esa lista donde Guid y DateTime son iguales (excepto uno). Habrá ocasiones en que esas dos propiedades serán iguales a las de otros elementos de la lista, pero las otras propiedades serán diferentes, por lo que no puedo usar .Distinct()

List<Message> messages = GetList(); //The list now contains many objects, it is ordered by the DateTime property messages = from p in messages.Distinct( what goes here? );

Esto es lo que tengo ahora, pero parece que debería haber una mejor manera

List<Message> messages = GetList(); for(int i = 0; i < messages.Count() - 1) //use Messages.Count() -1 because the last one has nothing after it to compare to { if(messages[i].id == messages[i+1}.id && messages[i].date == message[i+1].date) { messages.RemoveAt(i+1); { else { i++ } }


El DistinctBy Jon Skeet es definitivamente el camino a seguir, sin embargo, si está interesado en definir su propio método de extensión, puede que le interese esta versión más concisa:

public static IEnumerable<TSource> DistinctBy<TSource, TKey> (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) { var known = new HashSet<TKey>(); return source.Where(element => known.Add(keySelector(element))); }

que tiene la misma firma:

messages = messages.DistinctBy(x => new { x.id, x.date }).ToList();


LINQ to Objects no proporciona esta funcionalidad fácilmente de manera integrada, pero MoreLINQ tiene un método DistinctBy práctico:

messages = messages.DistinctBy(m => new { m.id, m.date }).ToList();


Prueba esto,

var messages = (from g1 in messages.GroupBy(s => s.id) from g2 in g1.GroupBy(s => s.date) select g2.First()).ToList();


Puedes revisar mi biblioteca de PowerfulExtensions . Actualmente se encuentra en una etapa muy joven, pero ya puede utilizar métodos como Distinct, Union, Intersect, Except en cualquier número de propiedades;

Así es como lo usas:

using PowerfulExtensions.Linq; ... var distinct = myArray.Distinct(x => x.A, x => x.B);


Que hay de esto

var messages = messages .GroupBy(m => m.id) .GroupBy(m => m.date) .Select(m => m.First());