簡體   English   中英

排序接口列表C#

[英]Sort Interface list C#

我正在嘗試按日期對接口列表進行排序,但我無法弄清楚。

var agencyList = new List<INewsItemBE>();

var item = new News1BE();
//add items
agencyList.Add(item)

var item = new News2BE();
//add items
agencyList.Add(item);

添加項目后,我想按日期用類似這樣的方式對agencyList進行排序,但是我無法使其正常工作。

agencyList.Sort(delegate (News1BE c1, News1BE c2) { return c1.PublishDate.CompareTo(c2.PublishDate); });

agencyList.Sort(delegate (News1BE a, News1BE b) => a.PublishDate.CompareTo(b.PublishDate));
agencyList = agencyList.OrderBy(x => cant find anything at x.).ToList();

嘗試LINQ:

using System.Linq;

var ordered = agencyList.OrderBy(x => x.PublishDate);

或者,如果您需要降序排列:

var orderedDesc = agencyList.OrderByDescending(x => x.PublishDate);

如果您再次需要原始變量中的列表,則可以調用.ToList()

agencyList = agencyList.OrderBy(x => x.PublishDate).ToList();

如果LINQ不適用於您(或者您希望獲得最佳性能,從而減少LINQ帶來的開銷),則可以使用嘗試的.Sort方法:

agencyList.Sort((item1, item2) => item1.PublishDate.CompareTo(item2.PublishDate));

您可以嘗試使用SortedList而不是List,這樣在添加項目時它將自動進行排序。

定義您的類/接口:

interface INews1BE
{
    DateTime PublishedDate { get; set; }
}

class News1BE : INews1BE
{
    public DateTime PublishedDate { get; set; }
}

為DateTime定義比較器:

class DateTimeAscendingComparer : IComparer<DateTime>
{
    public int Compare(DateTime a, DateTime b)
    {
        return a.CompareTo(b);
    }
}

現在創建比較器和將比較器傳遞給SortedList構造函數的排序列表:

var comparer = new DateTimeAscendingComparer();
var sortedList = new SortedList<DateTime, INews1BE>(comparer);

添加一些項目並檢查結果:

var item1 = new News1BE() 
{
    PublishedDate = DateTime.Now
};

var item2 = new News1BE()
{
    PublishedDate = item1.PublishedDate.AddSeconds(-30)
};

sortedList.Add(item1.PublishedDate, item1);

//item2 goes before item1
sortedList.Add(item2.PublishedDate, item2);

foreach(var x in sortedList)
{
    Console.WriteLine(x.Key);
}

您還可以通過值訪問對象:

foreach (var x in sortedList)
{
    Console.WriteLine(x.Value.PublishedDate);
}

或者,您可以遍歷Values以立即訪問您的INews1BE對象:

foreach(var x in sortedList.Values)
{
    Console.WriteLine(x.PublishedDate);
}

實際上,如果您只關心升序,則不必為DateTime定義比較器-這是默認行為,因此您可以創建SortedList而不將比較器傳遞給構造函數:

var sortedList = new SortedList<DateTime, INews1BE>();

但是,如果需要降序,只需在比較時將DateTime a與DateTime b切換即可:

class DateTimeDescendingComparer : IComparer<DateTime>
{
    public int Compare(DateTime a, DateTime b)
    {
        return b.CompareTo(a);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM