2013-07-17 2 views
1

У меня есть список объектов, у которых есть свойство DateTime, и мне нужно отсортировать этот список, чтобы объекты с ближайшей датой к DateTime.Now были первыми в списке.Сортировать список дат, ближайших к текущей дате

Я попытался следующие:

nodes.Sort((x, y) => DateTime.Compare(
     DateTime.Now, 
     DateTime.Parse(x.GetProperty("date").Value))); 

Но это не возвращает правильный результат.

Кто-нибудь знает, как это сделать? :-)

+1

Вы можете не просто 'OrderByDescending' даты? –

+1

[Первый результат google для «Sort Date Time C#»] (http://www.dotnetperls.com/sort-datetime) - hmm ... – Sayse

+2

Вы хотите, чтобы отсортировать по абс (date - Now) ? –

ответ

7

Вы можете заказать их по абсолютной разности между временем узла и текущим временем. Вы можете получить абсолютное время в TimeSpan с методом Duration:

DateTime now = DateTime.Now; 
var ordered = nodes.OrderBy(n => (now - DateTime.Parse(n.GetProperty("date").Value)).Duration()) 
+0

Это! Это то, что мне нужно! :-) Большое спасибо, Ли. – bomortensen

2

Вы попробовали OrderByDescending?

nodes.OrderByDescending(x => DateTime.Parse(x.GetProperty("date").Value)); 

Не уверен, если это будет точно то, что вы после этого, но если все, что вы пытаетесь сделать, это заказать список по самой последней датой это будет делать эту работу.

+0

Ваш ответ предполагает, что в будущем нет дат. – Rotem

+1

@Rotem это не * предположить * что угодно, я сказал "* если все, что вы пытаетесь сделать, это заказать список по самой последней дате, это сделает работу *". – James

+0

От OP: ** «Мне нужно отсортировать этот список, чтобы объекты с ближайшей датой к DateTime.Now были первыми в списке». **. Кроме того, вы добавили эту часть после моего первого комментария. – Rotem

0
from node in nodes 
let diff = Math.Abs(DateTime.Now.Subtract(node.DateTime).TotalSeconds) 
order by diff 
select date 
0

как бой

nodes.Sort((x,y) => Math.Abs((DateTime.Now, DateTime.Parse(x.GetProperty ("date").Value).Ticks)) 
0
class Program 
{ 
    static void Main(string[] args) 
    { 
     Program p = new Program(); 
     var recs = p.ReadVisitorsByMonthly(); 
     Console.WriteLine(); 

     foreach (var r in recs) 
     { 
      Console.WriteLine(r); 
     } 

     Console.ReadLine(); 
    } 

    public List<string> ReadVisitorsByMonthly() 
    { 
     Dictionary<int, int> retL = new Dictionary<int, int>(); 
     List<DateTime> liste = new List<DateTime>(); 
     List<string> ret = new List<string>(); 

     liste.Add(new DateTime(2016, 4, 1)); 
     liste.Add(new DateTime(2016, 4, 4)); 
     liste.Add(new DateTime(2016, 4, 5)); 
     liste.Add(new DateTime(2016, 4, 2)); 
     liste.Add(new DateTime(2016, 4, 3)); 
     liste.Add(new DateTime(2015, 11, 6)); 
     liste.Add(new DateTime(2015, 12, 7)); 
     liste.Add(new DateTime(2015, 12, 8)); 
     liste.Add(new DateTime(2015, 11, 4)); 
     liste.Add(new DateTime(2015, 12, 4)); 
     liste.Add(new DateTime(2016, 5, 1)); 
     liste.Add(new DateTime(2016, 5, 6)); 
     liste.Add(new DateTime(2016, 5, 2)); 
     liste.Add(new DateTime(2016, 5, 3)); 
     liste.Add(new DateTime(2016, 2, 8)); 
     liste.Add(new DateTime(2016, 2, 6)); 
     liste.Add(new DateTime(2016, 2, 2)); 
     liste.Add(new DateTime(2016, 2, 1)); 
     liste.Add(new DateTime(2016, 1, 3)); 
     liste.Add(new DateTime(2016, 3, 5)); 
     liste.Add(new DateTime(2016, 3, 4)); 
     liste.Add(new DateTime(2016, 3, 7)); 
     liste.Add(new DateTime(2016, 3, 3)); 
     liste.Add(new DateTime(2016, 3, 5)); 



     var list = liste.GroupBy(j => j.Month).ToList(); 

     foreach (var g in list) 
     { 
      Console.WriteLine(g.Key.ToString("D2") + " - " + g.Count()); 
      retL.Add(g.Key, g.Count()); 
     } 


     var thisMonth = DateTime.Now.Month; 

     var finalList = retL.OrderBy(j => (thisMonth - (j.Key > thisMonth ? j.Key - 12 : j.Key))).ToList(); 

     foreach (var kvp in finalList) 
     { 
      string strMonthName = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(kvp.Key); 

      ret.Add(kvp.Key.ToString().PadRight(3) + strMonthName.PadRight(8) + kvp.Value); 
     } 

     return ret; 
    } 
} 
Смежные вопросы