1

我有一个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; }
}
4

5 回答 5

2

正如我在评论中所说,.ToList()在声明results变量的地方放置一个。那是:

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

如果您不这样做,foreach循环将修改可能与您稍后排序的对象不同的对象,因为每次您枚举您的IQueryable<>.

于 2013-05-01T07:21:27.250 回答
0

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

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

return Json(query, blah);
于 2013-05-01T07:26:21.603 回答
0

我很简单地做到了这一点,它对我有用:-

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

我所做的只是在对序列中的对象进行排序时,在空白区域的索引处 SubString the Title,这样,OrderBy 正在查看标题中的第一个字符而不是开头的数字。

于 2013-05-01T07:43:45.293 回答
0

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

升序:

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

降序排列:

locationMaterials.Sort((x, y) => y.Quantity.CompareTo(x.Quantity));
于 2020-06-19T17:32:33.940 回答
-1

你不见了.ToList()

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

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

[编辑]

我的回答假设您results的实际尚未实现,就是您的问题的根源。

于 2013-05-01T06:52:58.497 回答