我使用此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
的逻辑。
希望这能有所帮助。当做