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});
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
).
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();
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
};
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);
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());
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());