C# LINQ中的可数排序

C# LINQ中的可数排序,c#,linq,sorting,ienumerable,C#,Linq,Sorting,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 = "sa

可能重复:

是否可以通过不使用.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 eList=new List()
{
新的额外{id=1,text=“a”},
新的额外{id=2,text=“g”},
新的额外{id=3,text=“i”},
新的额外{id=4,text=“e”},
新的额外{id=5,text=“f”},
新的额外{id=6,text=“d”},
新的额外{id=7,text=“c”},
新的额外{id=8,text=“h”},
新的额外{id=9,text=“b”}
};
IEnumerable sam=新列表()
{
新样本{id=1,name=“样本1”,list=newlist{1,5,6},
新样本{id=2,name=“样本2”,list=newlist{2,9},
新样本{id=3,name=“样本3”,list=newlist{8,3,7},
新样本{id=4,name=“样本4”,list=newlist{3,4,8},
新样本{id=5,name=“样本5”,list=newlist{1,5,7},
新样本{id=6,name=“样本6”,list=newlist{6,9,7}
};
var排序=(从sam中的d1开始)
选择新的
{
name=d1.name,
id=d1.id,
名单=
(
从d1.1列表中的d2开始
在d2上的eList中加入e等于e.id
选择e.text
).OrderBy(item=>item).ToList()
}).OrderBy(item=>item.list.FirstOrDefault());
也许到时我会做

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”的原始代码,它对项目和“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
试试这个:

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());

它不起作用了……”string'不包含'list'的定义,并且没有扩展方法'list'接受'string'类型的第一个参数……哦,对了。我刚刚编辑过。试试新的。)预期。。。将其添加到OrderBy()中,但出现错误…'System.Collections.Generic.IEnumerable'不包含'ThenBy'的定义,并且没有扩展方法'ThenBy'接受'System.Collections.Generic.IEnumerable'类型的第一个参数。是的,
ThenBy
在这里没有意义,因为它是内部枚举,而不是外部枚举。等等,仅删除ToList()有什么问题。这对我来说很好。顺便说一句,你的命名习惯很痛苦。这只是一种练习。。。。在这里命名不是我的事。。。非常感谢,这一次我想你想把
ToList
列在这里。否则,您的
列表
成员包含一个
IEnumerable
,而不是
列表
,每次您枚举它时,它都将重新执行联接。如果您不介意的话,您可以删除
ToList
调用,然后顺序仍然相同。@Rawling,很抱歉,它不起作用。。它根本不会对列表进行排序。我真正想要实现的是首先对列表中的“列表”进行排序。然后,它将返回“sam”对象中的排序列表。然后现在“sam”对象将在其对象列表中再次排序。如果我理解你的意思,它已经像那样工作了。请在我编辑的帖子中查看结果转储
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());
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());