按每个条目后的名称排序

本文关键字:排序 | 更新日期: 2023-09-27 17:55:02

我使用此LINQ语句按产品名称(升序(对列表进行排序,该列表包含每个产品可用的产品名称(string(和Sizes(List<byte>(;

LinkedList<FullItemDetails> itemDetails = new LinkedList<FullItemDetails>();  
public class FullItemDetails   
{
    public string ProductName { get; set; }
    public List<byte> Sizes { get; set; }
}

现在每次我输入一个新的条目ex;Jacket,6,12,18,10,我想我的程序正在重新整理我的列表;

itemDetails.AddLast(fullItemDetails);
//SortedProducts
itemDetails = Products.OrderBy(x => x.ProductName).ToList();

如果列表已经排序,我只需要把最后一个条目放在正确的位置。最好的方法是什么。同时也可以降低算法的复杂性。感谢

按每个条目后的名称排序

这似乎是SortedList的理想问题,因为您有一个键(名称(和值(大小为List<int>(。

此处提供文档:http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx

列表声明如下所示:SortedList<string, List<int> >。所有插入都将按字符串排序,并且可以根据每个键枚举值。

使用SortedList<TKey, TValue>SortedSet<T>而不是List<T>。您可以通过相应的构造函数传入IComparer<T>以使用特定的排序算法。如果要使用Lambda表达式,可以使用一个小包装器类来包装Comparison<T>

这将导致类似的结果:

ICollection<FullItemDetails> _itemList = new SortedSet<FullItemDetails>(new ComparisonComparer<FullItemDetails>((x,y) -> x.ProductName.CompareTo(y.ProductName))

您的收藏现在将始终处于订购状态。

使用.NET 4.5时,可以使用Comparer<T>.Create从lambda表达式创建IComparer实现。

您可以使用SortedList<string,FullItemDetails>

你像list.Add(fullItemDetails.Name,fullItemDetails) 那样添加你的时间

[Edit]:添加或删除元素后,顺序将被保留。

[Edit2]使用LINQ您使用列表存储您的项目(添加/删除(:List<FullItemDetails> originalList和其他属性来读取您的排序数据:

IEnumerable<FullItemDetails> sortedList = originalList.OrderBy(e => e.Name).ThenBy(e => /* logic to order by another property*/);

现在,您可以迭代sortedList,因为这个排序列表是IEnumerable<T>,所以每次迭代它时,您将拥有与originalList中完全相同的元素(添加或删除项目后(。

换句话说:sortedList只包含读取originalList的逻辑。

希望这能有所帮助。当做