Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 除一个带有LINQ的条目外的排序列表_C#_Linq_Sorting - Fatal编程技术网

C# 除一个带有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 != "

我想对字符串列表进行排序,但列表中的一个字符串应该始终位于开头,而不是排序。使用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 != "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);
    }
}