每个条目后按名称排序

时间:2013-01-22 15:34:26

标签: c# linq sorting

我正在使用此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();

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

3 个答案:

答案 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 constructorShould 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的逻辑。

希望这会有所帮助。 问候。