我有一系列字符串:
"", "c", "a", "b".
我想使用LINQ orderby
,因此顺序是按字母顺序排列的,但最后是空字符串。所以在上面的例子中,顺序是:
"a", "b", "c", ""
答案 0 :(得分:31)
您可以使用以下内容:
var result = new[] { "a", "c", "", "b", "d", }
.OrderBy(string.IsNullOrWhiteSpace)
.ThenBy(s => s);
//Outputs "a", "b", "c", "d", ""
答案 1 :(得分:7)
除现有答案外,您可以IComparer<string>
提供OrderBy
重载:
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);
}
}
我没有声明这是 IComparer
实现的好示例(如果两个字符串都为空,它可能需要进行空检查和处理),但是答案的要点是展示OrderBy
重载,至少可以解决问题的样本数据。
由于评论中的反馈和我自己的好奇心,我提供了一个稍微复杂一点的实现,它还负责相对于彼此排序空字符串和空字符串。没有处理空格。
不过,关键是提供IComparer<string>
的能力,而不是你选择写作的能力: - )
答案 2 :(得分:0)
string[] linqSort = { "", "c","x", "a","" ,"b","z" };
var result = from s in linqSort
orderby string.IsNullOrEmpty(s),s
select s;