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