如何订购某些项目包含双引号的项目列表?
执行此操作FaqData = repo.FaqData.OrderBy(q => q.Description)
会产生以下结果
也试过这个
FaqData = repo.FaqData.OrderBy(q => q.QuestionDescription.Replace("”", ""))
答案 0 :(得分:1)
FaqData = repo.FaqData.OrderBy(q =&gt; q.Description.Replace(@&#34;&#34;&#34;&#34;,&#34;&#34;))< / p>
OrderBy对正在排序的列表中包含的每个项目调用一次委托。委托应返回一个值,当与列表中其他项目以相同方式获得的值进行比较时,该值将提供可以排序的值。
通常,委托中返回的值是所列项目的属性 - 但由于其代码,它可以返回您喜欢的任何内容,包括与列表中的项目无关的值。
在此示例中,而不是返回列表属性&#34; .Description&#34;代码返回一个新的字符串值,该值来自&#34; .Description&#34;属性。派生只是使用.net String.Replace将所有双引号值替换为空字符串。
这意味着排序算法对&#34; .Description&#34;进行排序。删除了双引号。
如果您多次调用此排序代码,则效率不高,并且可以轻松地以不同方式完成;通过向正在排序的类添加新属性;
public string PlainTextDescription
{
get {
return this.Description.Replace(@"""","");
}
}
并按此排序;
FaqData = repo.FaqData.OrderBy(q => q.PlainTextDescription)
或使用逻辑预填充PlainTextDescription字段,但仅在.Description值更改时;这会更有效率,因为String.Replace只会在每次.Description更改时调用一次 - 上面的示例中,每次分拣机需要评估PlainTextDescription字段时都必须调用String.Replace代码,这意味着我们& #39;多次执行String.Replace而不是一次。
答案 1 :(得分:1)
我认为你不仅要忽略引号,还要忽略任何不是A-Z的东西。
您需要做的就是在Where
中添加一项功能,删除您不想要的任何内容。为此,您可以使用正则表达式,如下所示:
var filtered = Regex.Replace(s, @"[^A-Za-z0-9]","")
现在把它放在Where
声明中:
var tests = new[] { "Advance","Access","Binding","Broker",@"""Chain free"" deal","`Twas the night before Christams","#NotAllMen","Zenit","Quickly"};
var sorted = tests.OrderBy(s => Regex.Replace(s, @"[^A-Za-z0-9]",""));
foreach (var s in sorted)
{
Console.WriteLine(s);
}
输出:
Access
Advance
Binding
Broker
"Chain free" deal
#NotAllMen
Quickly
`Twas the night before Christams
Zenit