订购包含双引号的商品

时间:2018-03-18 11:20:54

标签: c# sorting

如何订购某些项目包含双引号的项目列表?

  • 高级
  • 访问
  • “无链”交易
  • 结合
  • 经纪人

执行此操作FaqData = repo.FaqData.OrderBy(q => q.Description)会产生以下结果

  • “无链”交易
  • 高级
  • 访问
  • 结合
  • 经纪人

也试过这个

 FaqData = repo.FaqData.OrderBy(q => q.QuestionDescription.Replace("”", ""))

2 个答案:

答案 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

Code on DotNetFiddle