C# 除一个带有LINQ的条目外的排序列表
我想对字符串列表进行排序,但列表中的一个字符串应该始终位于开头,而不是排序。使用LINQ最简单的方法是什么C# 除一个带有LINQ的条目外的排序列表,c#,linq,sorting,C#,Linq,Sorting,我想对字符串列表进行排序,但列表中的一个字符串应该始终位于开头,而不是排序。使用LINQ最简单的方法是什么 //should be ordered in: first, a,b,u,z: List<string> l = {"z","u","first","b","a"}; //应按以下顺序排列:第一,a,b,u,z: 列表l={“z”、“u”、“first”、“b”、“a”}; LINQ中没有前置方法或其他东西,是吗 l = l.OrderBy(i => i != "
//should be ordered in: first, a,b,u,z:
List<string> l = {"z","u","first","b","a"};
//应按以下顺序排列:第一,a,b,u,z:
列表l={“z”、“u”、“first”、“b”、“a”};
LINQ中没有前置方法或其他东西,是吗
l = l.OrderBy(i => i != "first").ThenBy(i => i).ToList();
这里的诀窍是根据所讨论的项目是否是您的特殊项目来订购,然后按照您通常会使用的项目来订购
既然您说过要对列表进行排序(使用linq),请不要忘记将查询结果分配回列表
您还询问了prepend方法,该方法如何:
l = new[] { "first" }.Concat(l).ToList();
您可以轻松地将其作为扩展方法:
public static class LinqExtensions
{
public static IEnumerable<T> Prepend<T>(this IEnumerable<T> query, T item)
{
return new[] { item }.Concat(query);
}
}
您可以使用
OrderBy
,ThenBy
模式:
string[] l = { "z", "u", "first", "b", "a" };
var result = l.OrderBy(i => i != "first").ThenBy(i => i);
按两个标准排序。第一个标准基于某种谓词,第二个标准基于项的值:
[TestMethod]
public void TestMethod1()
{
var list = new[] { "z", "u", "first", "b", "a" }.OrderByPredicateFirst(s => s == "first").ToList();
Assert.AreEqual("first", list[0]);
Assert.AreEqual("a", list[1]);
Assert.AreEqual("b", list[2]);
Assert.AreEqual("u", list[3]);
Assert.AreEqual("z", list[4]);
}
public static class Extensions
{
public static IEnumerable<T> OrderByPredicateFirst<T>(this IEnumerable<T> source, Predicate<T> firsts)
{
return source
.OrderBy(s => firsts(s) ? 0 : 1)
.ThenBy(s => s);
}
}
[TestMethod]
公共void TestMethod1()
{
var list=new[]{“z”、“u”、“first”、“b”、“a”}.OrderByPredicateFirst(s=>s==“first”).ToList();
aresequal(“第一”,列表[0]);
Assert.AreEqual(“a”,列表[1]);
Assert.AreEqual(“b”,列表[2]);
Assert.AreEqual(“u”,列表[3]);
Assert.AreEqual(“z”,列表[4]);
}
公共静态类扩展
{
公共静态IEnumerable OrderByPredicateFirst(此IEnumerable源,谓词优先)
{
返回源
.OrderBy=>firsts?0:1
。然后是(s=>s);
}
}
i!=“首先”
让我微笑:)
如果我们有两个或更多的条目需要豁免,怎么样?@IvanMatala:!新[]{“first”,“2”}。包含(i)
@GeorgeDuckett,太棒了!我只是不明白,OrderBy(I=>I!=“first”)
如何将“first”放在列表的开头。您能解释一下吗?@Marcello表达式对我们首先想要的项目的计算结果为false,对所有其他项目的计算结果为true。按布尔值排序时,先是假值(我们的项),然后是真值(所有其他项)。
[TestMethod]
public void TestMethod1()
{
var list = new[] { "z", "u", "first", "b", "a" }.OrderByPredicateFirst(s => s == "first").ToList();
Assert.AreEqual("first", list[0]);
Assert.AreEqual("a", list[1]);
Assert.AreEqual("b", list[2]);
Assert.AreEqual("u", list[3]);
Assert.AreEqual("z", list[4]);
}
public static class Extensions
{
public static IEnumerable<T> OrderByPredicateFirst<T>(this IEnumerable<T> source, Predicate<T> firsts)
{
return source
.OrderBy(s => firsts(s) ? 0 : 1)
.ThenBy(s => s);
}
}