使用OrderByDescending对对象列表进行排序

时间:2013-05-01 06:51:01

标签: c# linq

我有一个object (KS),其中包含ID and Title(其中有一个数字作为标题的一部分)。

我要做的就是按降序排序。该对象有:

ID    Title
1     1 Outlook VPN 
2     2 Outlook Access
3     4 Access VBA
4     3 Excel Automation

因此,当按标题排序时,它应显示为:

ID    Title
3     4 Access VBA
4     3 Excel Automation
2     2 Outlook Access
1     1 Outlook VPN 

我用来对其进行排序的代码是:

IEnumerable<KS> query = results.OrderByDescending(x => x.Title);

但是,查询仍然具有原始顺序的对象!

标题的开头是否有我缺少的数据?

修改

为了清楚起见,我添加了控制器中的代码:

    [HttpPost]
    // [ValidateAntiForgeryToken]
    // id is a string of words eg: "outlook access vpn"
    // I split the words and want to check the Title to see how many words appear
    // Then sort by the most words found
    public JsonResult Lookup(string id)
    {
        List<string> listOfSearch = id.Split(' ').ToList();
        var results = db.KS.Where(x => listOfSearch.Any(item => x.Title.Contains(item)));

        // search each result, and count how many of the search words in id are found
        // then add the count to the start of Title
            foreach (KS result in results)
            {
                result.KSId = 0;
                foreach (string li in listOfSearch)
                {
                    if (result.Title.ToLower().Contains(li.ToLower()))
                    {
                        result.KSId += 1;
                    }
                }
                result.Title = result.KSId.ToString() + " " + result.Title;
            }
       // sort the results based on the Title - which has number of words at the start
       IEnumerable<KS> query = results.OrderByDescending(x => x.Title).ToList();
       return Json(query, JsonRequestBehavior.AllowGet);
    }

以下是填充查询后的屏幕截图,按顺序显示标题:1,2,1,1:

VSSS

对象的模型如果有帮助:

 public class KS
{
    public int KSId { get; set; }
    public string KSSol { get; set; }
    public string Title { get; set; }
    public string Fix { get; set; }
}

5 个答案:

答案 0 :(得分:3)

正如我在评论中所说,将.ToList()放在您声明results变量的位置。那就是:

var results = db.KS.Where(x => listOfSearch.Any(item => x.Title.Contains(item)))
    .ToList();

如果不这样做,foreach循环将修改可能与您稍后排序的对象不同的对象,因为每次枚举{{1}时都会再次运行数据库查询}。

答案 1 :(得分:0)

你总是可以忽略这种奇怪的行为并采取安全的方式:

List<KS> query = results.ToList();
query.Sort((a, b) => a.Whatever.CompareTo(b.Whatever));

return Json(query, blah);

答案 2 :(得分:0)

我这很简单,这对我有用: -

var sortedOrder = Query.OrderBy(b => b.Title.Substring(b.Title.IndexOf(" ")));

我所做的就是在序列中排序对象时,在空格的索引处对字符串进行SubString,这样,OrderBy会查看标题中的第一个字符而不是开头的数字。 / p>

答案 3 :(得分:0)

古老的问题,但这也许会对使用C#的人有所帮助。我使用以下表达式根据对象的数量参数以升序或降序对对象列表进行排序。可以修改它以比较原始问题所涉及的文本。

升序:

locationMaterials.Sort((x, y) => x.Quantity.CompareTo(y.Quantity));

降序:

locationMaterials.Sort((x, y) => y.Quantity.CompareTo(x.Quantity));

答案 4 :(得分:-1)

您缺少.ToList()

IEnumerable<KS> query = results.OrderByDescending(x => x.Title).ToList();

results.OrderByDescending(x => x.Title)是一个查询,它没有数据。 ToList()强制执行查询。

[编辑]

我的回答是假设您的results已经实际 ,并且 是您问题的根源。