我有類人
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string VisitPlace { get; set; }
}
我有這個班級的名單
List<Person> list = new List<Person>()
{
new Person { FirstName = "Name1", LastName = "Smith", VisitPlace = "London; Paris" },
new Person { FirstName = "Name2", LastName = "Smith", VisitPlace = "Berlin" },
new Person { FirstName = "Name3", LastName = "Smith", VisitPlace = "London; Berlin" },
new Person { FirstName = "Name4", LastName = "Smith", VisitPlace = "Berlin" },
new Person { FirstName = "Name5", LastName = "Smith", VisitPlace = null },
new Person { FirstName = "Name6", LastName = "Smith", VisitPlace = "Paris" },
new Person { FirstName = "Name7", LastName = "Smith", VisitPlace = null },
new Person { FirstName = "Name8", LastName = "Smith", VisitPlace = "Paris; London" },
new Person { FirstName = "Name9", LastName = "Smith", VisitPlace = "London" },
};
我想對這個串列進行排序:
參觀者Place London
參觀者Place Paris
訪問柏林的人(例如,如果一個人有兩個訪問地點(VisitPlace = London;Paris),那么重要的是第一名)
所有 visitPlace = null 的人 - 在串列的末尾
var list2 = list.OrderByDescending(x => x.VisitPlace).ThenByDescending(x => x.VisitPlace == "London").ThenBy(x => x.VisitPlace == "Paris").ThenBy(x => x.VisitPlace == "Berlin");
串列中正確的人:Person1、Person3、Person9、Person6、Person8、Person2、Person4、Person5、Person7
它是排序的,但只是 orderbyDescending。ThenBy 不起作用。
為什么 thenBy 不起作用?如何使用 linq 正確排序?
uj5u.com熱心網友回復:
這對我有用:
var list2 = list
.OrderBy(x => x.VisitPlace?.Split(';').First() == "London")
.ThenBy(x => x.VisitPlace?.Split(';').First() == "Paris")
.ThenBy(x => x.VisitPlace?.Split(';').First() == "Berlin")
.ThenByDescending(x => x.FirstName)
.Reverse()
.ToList();
uj5u.com熱心網友回復:
這對我有用:
var priority = new [] { "London", "Paris", "Berlin" };
var list2 =
list
.OrderBy(x =>
x.VisitPlace == null
? priority.Length
: Array.IndexOf(priority, x.VisitPlace.Split(';')[0]))
.ToList();
它給:

一個更強大的版本是這樣的:
var list2 =
(
from person in list
let firstVisitPlace =
person.VisitPlace == null
? null
: person.VisitPlace.Split(';')[0]
let position =
priority.Contains(firstVisitPlace)
? Array.IndexOf(priority, firstVisitPlace)
: priority.Length
orderby position
select person
).ToList();
uj5u.com熱心網友回復:
這對我有用:
我會將邏輯移至專用方法,如下所示:
foreach (var item in people.OrderBy(MyMagicOrder))
{
Console.WriteLine($"{item.FirstName} | {item.VisitPlace}");
}
int MyMagicOrder(Person p)
{
if (string.IsNullOrEmpty(p.VisitPlace))
return 4;
var split = p.VisitPlace.Split(";", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var firstVisitPlace = split.First();
if (firstVisitPlace == "London")
return 0;
if (firstVisitPlace == "Paris")
return 1;
if (firstVisitPlace == "Berlin")
return 2;
return 3;
}
在這里您可以看到一個有效的解決方案:
https://dotnetfiddle.net/50kYS2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/515641.html
標籤:C#列表林克排序
上一篇:如何在C#中使用另一個List<int>搜索List<list<int>>
下一篇:將物件串列的格式轉換為另一種
