4

stringこの LINQ ステートメントを使用して、製品名 ( ) と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();

リストが既にソートされている場合は、最後のエントリを正しい場所に配置するだけで済みます。それを行う最善の方法は何ですか。また、アルゴリズムの複雑さを軽減します。ありがとう

4

3 に答える 3

2

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>を使用します。を渡して、それぞれのコンストラクターを介して特定の並べ替えアルゴリズムを使用できます。Lambda 式を使用する必要がある場合は、小さなラッパー クラスを使用して.SortedList<TKey, TValue>SortedSet<T>IComparer<T>Comparison<T>

次のような結果になります。

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

あなたのコレクションは常に注文されます。

.NET 4.5 を使用している場合は、ラムダ式から実装を作成するために使用Comparer<T>.CreateIComparerできます。

于 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 に答える