我有一组字符串:
"", "c", "a", "b".
我想使用LINQ的orderby
,使得顺序为按字母顺序排序,但是空字符串排在最后。因此,在上面的例子中,顺序将是:
"a", "b", "c", ""
你可以使用类似下面的代码:
var result = new[] { "a", "c", "", "b", "d", }
.OrderBy(string.IsNullOrWhiteSpace)
.ThenBy(s => s);
//Outputs "a", "b", "c", "d", ""
除了现有的答案之外,您还可以为OrderBy
重载提供一个IComparer<string>
:
class Program
{
static void Main(string[] args)
{
var letters = new[] {"b", "a", "", "c", null, null, ""};
var ordered = letters.OrderBy(l => l, new NullOrEmptyStringReducer());
// Results: "a", "b", "c", "", "", null, null
Console.Read();
}
}
class NullOrEmptyStringReducer : IComparer<string>
{
public int Compare(string x, string y)
{
var xNull = x == null;
var yNull = y == null;
if (xNull && yNull)
return 0;
if (xNull)
return 1;
if (yNull)
return -1;
var xEmpty = x == "";
var yEmpty = y == "";
if (xEmpty && yEmpty)
return 0;
if (xEmpty)
return 1;
if (yEmpty)
return -1;
return string.Compare(x, y);
}
}
x
和y
都为空/ null,它将不会返回0
。编辑:啊,最后一个好警告。+1 - Chris SinclairOrderBy
的想法,并且至少可以使用提供的示例数组。答案的重点不在于实现,而在于OrderBy
重载。 - Adam Houldsworthstring.Compare
能够做到这一点,但在这种情况下它不会被执行。 - Sriram SakthivelNullOrEmptyStringReducer
类可以指定 Comparer<string>
作为它的基类。然后该方法应该重写继承的 abstract
方法。这样很容易。优点是你可以免费获得通用的 IComparer<>
和非通用的 IComparer
,相当于一次性获取两者(即使你只需要其中之一)。 - Jeppe Stig Nielsenstring[] linqSort = { "", "c","x", "a","" ,"b","z" };
var result = from s in linqSort
orderby string.IsNullOrEmpty(s),s
select s;
source.OrderBy(string.IsNullOrWhiteSpace).ThenBy(s => s)
。 - Jeppe Stig Nielsen