标签: iorderedenumerable

是否可以在不使用OrderBy的情况下将IEnumerable转换为IOrderedEnumerable?

假设有一种扩展方法可以根据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)

sortMethodis 的情况下null(即指定我不关心值的顺序),是否有一种方法来代替通过某个默认属性排序,而只是将IEnumerator值传递为"有序"而不是必须执行实际排序?

我希望能够调用此扩展,然后可能执行一些额外的ThenBy排序.

c# linq ienumerable iorderedenumerable

26
推荐指数
2
解决办法
7028
查看次数

什么时候返回IOrderedEnumerable?

应该IOrderedEnumerable用作纯粹语义值的返回类型吗?

例如,在表示层中使用模型时,我们如何知道集合是否需要订购或已经订购?

在存储库用ORDER BY子句包装存储过程的情况下怎么办?存储库应该返回IOrderedEnumerable吗?那将如何实现?

.net c# linq iorderedenumerable semantics

22
推荐指数
2
解决办法
8369
查看次数

.Net中的IOrderedEnumerable.ThenBy()如何工作?

我想了解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的函数!

.net vb.net ienumerable iorderedenumerable

12
推荐指数
1
解决办法
1054
查看次数

IOrderedEnumerable.Select()会保留元素顺序吗?

在C#中,是否会Select()用于投影IOrderedEnumerableretain元素的元素顺序?

  • 如果是这样,它怎么回来了IEnumerable,而不是IOrderedEnumerable
  • 如果没有,我怎样才能做到这一点(除了使用foreach)?

请注意,这个问题是不是重复这一个 -我只有一个Select()条款,没有Distinct().

编辑

是的,它是对象的LINQ.顺便说一句,如果我实际上在查询一些SQL DB,答案会有什么不同吗?

c# ienumerable iorderedenumerable

10
推荐指数
1
解决办法
1549
查看次数

5
推荐指数
1
解决办法
341
查看次数

Linq如何在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中的程序集,看看编译器是否正在重新排序任何操作,但它似乎没有.这是如何运作的?

linq ienumerable iorderedenumerable

3
推荐指数
1
解决办法
2347
查看次数

为什么IOrderedEnumerable无法重新实现.Contains()以获取性能

如果您去这里:IOrderedEnumerableDocs并单击.Contains()方法,那么它将带您到这里:广义Enumerable.Contains()docs

我的意思是说它只是在使用底层的IEnumerable实现?

考虑到您知道可以将排序后的列表与元素进行比较,考虑到可能进行更高性能的搜索,这似乎很奇怪(例如,执行二进制搜索以确认元素是否存在,而不是枚举整个集合?

我有什么想念的吗?

c# ienumerable contains iorderedenumerable

3
推荐指数
1
解决办法
407
查看次数

从 IOrderedEnumerable 中删除对象

我像这样对字典进行排序:

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)

c# linq collections iorderedenumerable

2
推荐指数
1
解决办法
1996
查看次数

OrderBy Linq的奇怪行为

我有一个使用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()子句一起使用时,保留了顺序.

有谁能帮助我这里发生的事情?

样本输出图示:

在此输入图像描述

c# linq ienumerable iorderedenumerable

2
推荐指数
1
解决办法
412
查看次数

Linq与IOrderedEnumerable和Where有多聪明

所以,假设我有一个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# linq iorderedenumerable

1
推荐指数
1
解决办法
237
查看次数