假设有一种扩展方法可以根据SortMethod
枚举指定的几种类型的排序(即按各种属性排序)来订购IQueryable .
public static IOrderedEnumerable<AClass> OrderByX(this IQueryable<AClass> values,
SortMethod? sortMethod)
{
IOrderedEnumerable<AClass> queryRes = null;
switch (sortMethod)
{
case SortMethod.Method1:
queryRes = values.OrderBy(a => a.Property1);
break;
case SortMethod.Method2:
queryRes = values.OrderBy(a => a.Property2);
break;
case null:
queryRes = values.OrderBy(a => a.DefaultProperty);
break;
default:
queryRes = values.OrderBy(a => a.DefaultProperty);
break;
}
return queryRes;
}
Run Code Online (Sandbox Code Playgroud)
在sortMethod
is 的情况下null
(即指定我不关心值的顺序),是否有一种方法来代替通过某个默认属性排序,而只是将IEnumerator
值传递为"有序"而不是必须执行实际排序?
我希望能够调用此扩展,然后可能执行一些额外的ThenBy
排序.
应该IOrderedEnumerable
用作纯粹语义值的返回类型吗?
例如,在表示层中使用模型时,我们如何知道集合是否需要订购或已经订购?
在存储库用ORDER BY
子句包装存储过程的情况下怎么办?存储库应该返回IOrderedEnumerable
吗?那将如何实现?
我想了解ThenBy如何在.Net中工作.(我知道如何使用它,我只是不明白微软如何实现它!)
根据文档,string_list.OrderBy(Function (x) x.length).ThenBy(Function (x) x)
应输出按长度排序的字符串列表,然后按字母顺序输出.怎么可能有用?!?第一种是长度.第二种排序应该撤消第一种排序!
假设这段代码:
Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
sorted_by_length = sorted_by_length.ThenBy(Function
Run Code Online (Sandbox Code Playgroud)
这是我试图在不使用的情况下实现最后一行ThenBy
:
Dim sorted_by_length As IOrderedEnumerable(Of String)
sorted_by_length = string_list.OrderBy(Function (x) x.length)
'my implementation of OrderBy:
Dim e as IEnumerator(Of String) = sorted_by_length.GetEnumerator
Do While e.MoveNext
'I have no idea what to write here!
Loop
Run Code Online (Sandbox Code Playgroud)
这里有一些神奇的东西......是否有一些e.GetPreviousKeySelector()函数?实际上,我甚至无法编写一个返回IOrderedEnumerable的函数!
在C#中,是否会Select()
用于投影IOrderedEnumerable
retain元素的元素顺序?
IEnumerable
,而不是IOrderedEnumerable
?foreach
)?请注意,这个问题是不是重复这一个 -我只有一个Select()
条款,没有Distinct()
.
编辑
是的,它是对象的LINQ.顺便说一句,如果我实际上在查询一些SQL DB,答案会有什么不同吗?
返回IOrderedEnumerable而不是IEnumerable的方法是否有利?
在Linq中,扩展方法如Where
返回IEnumerable
集合,但排序方法如OrderBy
返回IOrderedEnumerable
集合.
因此,如果您的查询以OrderBy
(即返回一个IOrderedEnumerable
)结束,则以后不能附加Where
方法 - 编译器会抱怨传入的类型Where
.
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id);
query = query.Where(p => p.ProcessName.Length < 5);
Run Code Online (Sandbox Code Playgroud)
但是,如果你在一个查询中完成所有操作,那很好!
var query = Process.GetProcesses()
.Where(p => p.ProcessName.Length < 10)
.OrderBy(p => p.Id)
.Where(p => p.ProcessName.Length < 5);
Run Code Online (Sandbox Code Playgroud)
我查看了Reflector中的程序集,看看编译器是否正在重新排序任何操作,但它似乎没有.这是如何运作的?
如果您去这里:IOrderedEnumerableDocs并单击.Contains()方法,那么它将带您到这里:广义Enumerable.Contains()docs
我的意思是说它只是在使用底层的IEnumerable实现?
考虑到您知道可以将排序后的列表与元素进行比较,考虑到可能进行更高性能的搜索,这似乎很奇怪(例如,执行二进制搜索以确认元素是否存在,而不是枚举整个集合?
我有什么想念的吗?
我像这样对字典进行排序:
var sortedListOfNodes = _nodeDictionary.Values.OrderBy((n) => n.Time);
Run Code Online (Sandbox Code Playgroud)
然后我选择了一个元素:
var selectedNode = sortedListOfNodes.First(n => n.Time - CurrentTime > new TimeSpan(1,0,0));
Run Code Online (Sandbox Code Playgroud)
然后我对该节点进行了一些处理,最后想从列表中删除该节点,而不破坏排序顺序。
下面会维持秩序吗?
sortedListOfNodes = (IOrderedEnumerable<Node>)sortedListOfNodes.Where(node => node != selectedNode);
Run Code Online (Sandbox Code Playgroud) 我有一个使用OrderBy()
Linq函数排序的列表,它返回一个IOrderedEnumerable
.
var testList = myList.OrderBy(obj => obj.ParamName);
Run Code Online (Sandbox Code Playgroud)
ParamName是一个可以保存整数和字符串的对象.上面的orderBy基于整数值对列表进行排序.现在我在testList上运行foreach并根据其整数值将ParamName属性更改为某个字符串,如下所示,
using (var sequenceEnum = testList.GetEnumerator())
{
while (sequenceEnum.MoveNext())
{
sequenceEnum.Current.ParamName = GetStringForInteger(int.Parse(Convert.ToString(sequenceEnum.Current.ParamName)));
}
}
Run Code Online (Sandbox Code Playgroud)
接下来发生的事情是上一循环之后列表中项目的顺序已被中断,并且已根据分配的字符串而不是初始排序对列表进行排序.
但是,当我.ToList()
与该.OrderBy()
子句一起使用时,保留了顺序.
有谁能帮助我这里发生的事情?
样本输出图示:
所以,假设我有一个IEnumerable日期,我希望得到一个范围内的日期.
Linq和IOrderedEnumerable足够智能,可以实现选择更快算法的能力,因为现在订购了日期.
所以考虑一下:
IOrderedEnumerable<ObjectWith2DateTimes> orderedDates = dates.OrderBy(x => new Tuple(x.datetime1,x.datetime2));
...
this is called a bunch
...
DateTime afterDateTime = (some datetime)
DateTime beforeDateTime = (other datetime)
yield return orderedDates.Where(x => x.datetime1 >= afterDateTime && x.datetime2 <= beforeDateTime)
Run Code Online (Sandbox Code Playgroud)
如果这个实现不聪明,是否还有一些其他实现可以使它变得聪明?
c# ×7
ienumerable ×7
linq ×7
.net ×2
collections ×1
contains ×1
optimization ×1
semantics ×1
vb.net ×1