0

重複の可能性:
LINQ での IEnumerable の並べ替え

.ToList() を使用しないでこれをソートすることは可能ですか?

以下のコードを参照してください。

以下のコードは、この出力になります。

    { id = 1, name = "sample 1", list = {'a','f','d'}},         
    { id = 5, name = "sample 1", list = {'a','f','c'}},
    { id = 2, name = "sample 1", list = {'g','b'}},
    { id = 4, name = "sample 1", list = {'i','e','h'}},
    { id = 6, name = "sample 1", list = {'d','b','c'}},
    { id = 3, name = "sample 1", list = {'h','i','c'}},

ありがとう

RJ

IEnumerable<extra> eList = new List<extra>()
{
    new extra{ id = 1, text = "a"},
    new extra{ id = 2, text = "g"},
    new extra{ id = 3, text = "i"},
    new extra{ id = 4, text = "e"},
    new extra{ id = 5, text = "f"},
    new extra{ id = 6, text = "d"},
    new extra{ id = 7, text = "c"},
    new extra{ id = 8, text = "h"},
    new extra{ id = 9, text = "b"}
};

IEnumerable<sample> sam = new List<sample>()
{
    new sample{ id = 1, name = "sample 1", list = new List<int>{1,5,6}},
    new sample{ id = 2, name = "sample 2", list = new List<int>{2,9}},
    new sample{ id = 3, name = "sample 3", list = new List<int>{8,3,7}},
    new sample{ id = 4, name = "sample 4", list = new List<int>{3,4,8}},
    new sample{ id = 5, name = "sample 5", list = new List<int>{1,5,7}},
    new sample{ id = 6, name = "sample 6", list = new List<int>{6,9,7}}
};

var sorted = (from d1 in sam
              select new
              {
                  name = d1.name,
                  id = d1.id,
                  list =
                  (
                      from d2 in d1.list
                      join e in eList on d2 equals e.id
                      select e.text
                  ).OrderBy(item => item).ToList()
              }).OrderBy(item => item.list.FirstOrDefault());
4

3 に答える 3

0

'ToList'を使用せずに元のコードをテストしたところ、アイテムと'extras'が適切に並べ替えられました。正確に何を達成したいのか詳しく教えてください。証拠:

ToListを使用した元のコードの結果:

1  "sample 1"  a d f  
5  "sample 5"  a c f  
2  "sample 2"  b g  
6  "sample 6"  b c d  
3  "sample 3"  c h i  
4  "sample 4"  e h i  

ToListなしのコードの結果:

1  "sample 1"  a d f   <-- adf is sorted
5  "sample 5"  a c f   <-- also sorted
2  "sample 2"  b g     <-- and here too
6  "sample 6"  b c d   <-- yep
3  "sample 3"  c h i   <-- it is!
4  "sample 4"  e h i   <-- ...
               ^
               |
               \ aabbce is sorted, too

私と同じように見えます:)

一般的な考え方として、「ToList」を使用せずにLINQ構文で記述された同じ小さな問題は、JOINがアイテムごとに1回、遅延して実行され、マッピング/結合を最初から構築するたびに、完全にキャッシュ可能になることです。と再利用可能。以下では、拡張構文で、マッピングを1回だけ明示的に事前作成してから、マテリアライズを使用しない他のすべてのレイジークエリが同じマッピングを共有します。このようにすると、数倍速くなり、使用するメモリが少なくなります。

var mapping = eList.ToDictionary(x => x.id, x=>x.text);

var temps = sam.Select(s =>
    new {
        id = s.id,
        name = s.name,
        stringlist = s.list.Select(id => mapping[id]).OrderBy(str => str)
    });

var result = temps.OrderBy(t => t.stringlist.FirstOrDefault());
于 2012-09-05T08:10:16.767 に答える
0

多分ThenByはそれをしますか?

var sorted = (from d1 in sam 
              select new 
              { 
                  name = d1.name, 
                  id = d1.id, 
                  list = 
                  ( 
                      from d2 in d1.list 
                      join e in eList on d2 equals e.id 
                      select e.text 
                  ).OrderBy(item => item 
              }).ThenBy(item => item.list.FirstOrDefault()); 

私は質問を誤解しました。ToListを削除しないのはなぜですか? コレクションにアクセスするたびにソートされないようにするために、おそらく .ToList() が必要です。

于 2012-09-05T07:36:09.110 に答える
0

これを試して:

var sorted = (from d1 in sam
              select new
              {
                  name = d1.name,
                  id = d1.id,
                  list =
                  (
                      from d2 in d1.list
                      join e in eList on d2 equals e.id
                      select e.text
                  )
              }).OrderBy(item => item.list.OrderBy(i => i).FirstOrDefault());
于 2012-09-05T08:37:46.310 に答える