我正在使用此LINQ语句按产品名称(升序)对列表进行排序,其中包含每个产品(string
)可用的产品名称(Sizes
)和List<byte>
; < / p>
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();
如果列表已经排序,我只需要将最后一个条目放在正确的位置。 什么是最好的方法。还可以降低算法的复杂性。感谢
答案 0 :(得分:2)
这似乎是SortedList
的理想问题,因为您有一个键(名称)和值(List<int>
的大小)。
此处提供了文档:http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx
列表声明如下所示:SortedList<string, List<int> >
。所有插入都将按字符串排序,并且可以根据每个键枚举值。
答案 1 :(得分:1)
而不是List<T>
,请使用SortedList<TKey, TValue>
或SortedSet<T>
。您可以传入IComparer<T>
以使用特定的排序算法through the respective constructor。 Should you want to use a Lambda expression, you can use a small wrapper class to wrap a Comparison<T>
这将导致类似:
ICollection<FullItemDetails> _itemList = new SortedSet<FullItemDetails>(new ComparisonComparer<FullItemDetails>((x,y) -> x.ProductName.CompareTo(y.ProductName))
现在将始终订购您的收藏。
当您使用.NET 4.5时,您可以use Comparer<T>.Create
to create an IComparer
implementation from a lambda expression。
答案 2 :(得分:0)
您可以使用SortedList<string,FullItemDetails>
。
您可以添加list.Add(fullItemDetails.Name,fullItemDetails)
[编辑] :添加或删除元素后,订单将被保留。
[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
的逻辑。
希望这会有所帮助。 问候。