wake-up-neo.com

Linq-Abfrage, um die verschiedenen Werte in einer Liste abzurufen

Angenommen, das ist meine Klasse

class Member 
{
    public string CategoryId { get; set; }
    public string MemberName { get; set; }
    public int Distance { get; set; }
}

Und das ist Liste.

var list = new List<Member>();
list.Add(new { CategoryId = "01", MemberName="andy" Distance=3});
list.Add(new { CategoryId = "02", MemberName="john" Distance=5});
list.Add(new { CategoryId = "01", MemberName="mathew" Distance=7});
list.Add(new { CategoryId = "03", MemberName="bakara" Distance=2});

Kann jemand die logische/linq-Abfrage vorschlagen, damit die Liste eine eindeutige/eindeutige categoryID mit kürzester Entfernung hat.

Die output sollte sein:

list.Add(new { CategoryId = "01", MemberName="andy" Distance=3});
list.Add(new { CategoryId = "02", MemberName="john" Distance=5});
list.Add(new { CategoryId = "03", MemberName="bakara" Distance=2});
8
PaRsH

Dies sollte Ihnen das geben, was Sie brauchen:

var grouped = list.GroupBy(item => item.CategoryId);
var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());

Zuerst werden die Elemente mit der gleichen CategoryId gruppiert und dann der erste aus jeder Gruppe ausgewählt (geordnet nach Distance). 

22
Kjartan

Dies ist ähnlich wie oben, jedoch technisch gesehen ein Einzeiler für Interessierte.

var queryResult= (from l in list
                  select new Member()
                 { 
                    CategoryId = l.CategoryId , 
                    MemberName = l.MemberName 
                    Distance = l.Distance
                 }).GroupBy(x=>x.CatagoryId).Select(z=>z.OrderBy(i=>i.Distance).First()).ToList();
4
Mike T

Sie können den folgenden Code verwenden: 

List<Member> sourceList = new List<Member>();
IEnumerable<Member> result = 
    (sourceList as IEnumerable<Member>)
    .Distinct()
    .OrderBy(value => value.CategoryId);

Gruppieren Sie die Liste in Kategorien, ordnen Sie dann jede Gruppierung nach Entfernung, wobei Sie den ersten Punkt (die niedrigste Entfernung) verwenden. Projizieren Sie die Ergebnisse in eine neue Member-Sammlung.

var query = from member in list 
            group member by member.CategoryId into memberGrouping
            let groupedMember = memberGrouping.OrderBy (mg => mg.Distance).First() 
            select new Member()
            { 
              CategoryId = memberGrouping.Key, 
              MemberName = groupedMember.MemberName, 
              Distance = groupedMember.Distance 
            };
1
asawyer

versuche dies

var distinctIds = list.Distinct(item => item.CategoryId).ToList();
var newList = new List<Member>();
foreach(var id in distinctIds){
      newList.Add(list.Where(item => item.CategoryId == id).Min(item => item.Distance))
}
newList.OrderBy(item => item.CategoryId);
0
Ravi
class Member {
    public string CategoryId {get; set;}
    public string MemberName{get; set;}
    public int Distance{get; set;}
}

var list = new List<Member>();
list.Add(new Member{ CategoryId = "01", MemberName="andy", Distance=3});
list.Add(new Member{ CategoryId = "02", MemberName="john", Distance=5});
list.Add(new Member{ CategoryId = "01", MemberName="mathew", Distance=7});
list.Add(new Member{ CategoryId = "03", MemberName="bakara", Distance=2});

var query = list.GroupBy(member => member.CategoryId).Select(x=>x.OrderBy(y=>y.Distance).First());
0
Original10

Dies funktioniert auch, wenn Sie keine Artikel nach (wenig modifiziert Kjartans Antwort ) bestellen.

var grouped = list.GroupBy(item => item.CategoryId).ToList();
var shortest = grouped.Select(grp => grp.OrderBy(item => item.Distance).First());
0
Aamol