按日期值排序列表

时间:2015-12-11 13:27:03

标签: c# linq sorting

我有以下列表 -

List<string> finalMessageContent

其中

finalMessageContent[0] = "<div class="mHr" id="mFID"> 
   <div id="postedDate">11/12/2015 11:12:16</div>
</div>" // etc etc

我正在尝试按照entires - postedDate标记中的特定值对列表进行排序。

首先,我创建了一个新对象,然后将其序列化以使html元素能够被解析 -

string[][] newfinalMessageContent = finalMessageContent.Select(x => new string[] { x }).ToArray();

string json = JsonConvert.SerializeObject(newfinalMessageContent);
JArray markerData = JArray.Parse(json);

然后使用Linq尝试使用OrderByDescending进行排序 -

var items = markerData.OrderByDescending(x => x["postedDate"].ToString()).ToList();

但是在尝试使用 -

解析条目时失败了
Accessed JArray values with invalid key value: "postedDate". Array position index expected.

也许linq不是去这里的方式,但它似乎是最优化的,我哪里出错?

3 个答案:

答案 0 :(得分:4)

首先,我不会使用字符串方法,正则表达式或JSON解析器来解析HTML。我会用HtmlAgilityPack。然后你可以提供这样一种方法:

private static DateTime? ExtractPostedDate(string inputHtml, string controlID = "postedDate")
{
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(inputHtml);
    HtmlNode  div = doc.GetElementbyId(controlID);
    DateTime? result = null;
    DateTime value;
    if (div != null && DateTime.TryParse(div.InnerText.Trim(), DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out value))
        result = value;
    return result;
}

并遵循LINQ查询:

finalMessageContent = finalMessageContent
    .Select(s => new { String = s, Date = ExtractPostedDate(s) })
    .Where(x => x.Date.HasValue)
    .OrderByDescending(x => x.Date.Value)
    .Select(x => x.String)
    .ToList();

答案 1 :(得分:0)

Json Serializer序列化JSON类型的字符串。 Example here to json

要解析HTML我建议使用HtmlAgility https://htmlagilitypack.codeplex.com/

像这样:

            HtmlAgilityPack.HtmlDocument htmlparsed = new HtmlAgilityPack.HtmlDocument();
            htmlParsed.LoadHtml(finalMessageContent[0]);
            List<HtmlNode> OrderedDivs = htmlParsed.DocumentNode.Descendants("div").
            Where(a => a.Attributes.Any(af => af.Value == "postedDate")).
            OrderByDescending(d => DateTime.Parse(d.InnerText)); //unsafe parsing

答案 2 :(得分:0)

不知道我的问题是否正确。 但是你知道你可以用XPath解析HTML吗?

foreach (var row in doc.DocumentNode.SelectNodes("//div[@id="postedDate"]")) 
{
    Console.WriteLine(row.InnerText);     
}

这只是我头脑中的一个例子,您可能需要根据您的文档仔细检查XPath查询。您还可以考虑将其转换为数组或解析日期并使用它进行其他转换。

就像我说的那样,这只是我的头脑。或者,如果html不那么完整,请考虑使用RegEx提取日期,但这将成为另一个问题的主题。

HTH