4

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

现在每次我输入一个新条目时;Jacket,6,12,18,10,我认为我的程序正在重新排序我的列表;

itemDetails.AddLast(fullItemDetails);

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

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

4

3 回答 3

2

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

文档可在此处获得:http: //msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx

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

于 2013-01-22T15:47:34.480 回答
1

代替List<T>,使用SortedList<TKey, TValue>SortedSet<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 时,可以使用lambda 表达式Comparer<T>.Create创建IComparer实现。

于 2013-01-22T15:52:44.317 回答
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

希望这可以帮助。问候。

于 2013-01-22T15:46:21.160 回答