2012-09-28 33 views
3

我正在使用如图所示声明的对象。“选择”元素的顺序是否有所不同?

DataCollection<Entity> collection = GetDataCollection(...); 

然后,我挑选出两组数据,如下所示。

IEnumerable<String> 
    array_1 = collection.Select(
    element => element.Attributes["attribute_1"] as String), 
    array_2 = collection.Select(
    element => element.Attributes["attribute_2"] as String); 

我非常好奇,如果这两个数组保证有相同的顺序。即如果他们的单独订单必须与原始序列中的相同。或者,至少,如果订单因任何原因而改变,第一个单独列表中的i th元素是否仍然对应于另一个元素中的i th元素?

+2

是安全的,在一次'变种ARR = collection.Select(元件同时获得ATTRS =>新的{ \t \t \t \t \t \t ATTR1 = element.Attributes [ “ATT1”]作为字符串, \t \t \t \t \t \t ATTR2 = element.Attributes [ “ATT2”]作为字符串 \t \t \t \t \t});' –

回答

2

他们不保证是相同的。实际上,您可能会注意到订单通常与原始集合一致。

如果您担心一致性问题,只需添加一个OrderBy子句即可获得您需要的订单(或者至少两个结果集合之间保持一致)。

+1

是否有可能'OrderBy'它们没有指定明确排序功能?我的意思是像'OrderType.WhateverYouHadBefore'或'OrderType.JustAsLongAsYouAreConsistent'这样的排序函数。或者我在说jibrish? –

+0

@Chamster - 除非原始组合是以某种方式订购的,否。 –

+0

@Chamster在linq-to-objects中,当然。 'Select'将始终保持对任何“IEnumerable”的排序。一个'IQueryable'' Select'调用在数据库中完成,因此它完全依赖于该提供者以及该数据库设计,以确定查询是否总是具有相同的顺序。 – Servy

0

检查这个答案:

Preserving order with LINQ

它不会出现,从这个答案至少,选择调用保证是相同的顺序。

我仍然遵循这个OrderBy(...)。看起来你永远无法确定使用LINQ调用,所以如果有人进来并增加了一个额外的LINQ调用,他们可能不知道你期望他们是同一个订单。

+0

我同意实用的应用程序,但不喜欢(潜在的)冗余)。 :)当交付时,我会与您的建议,但。 –

+0

您的链接仅适用于Linq-to-Objects而非Entity Framework查询。 – Servy

相关问题