2013-08-26 16 views
9

Ben IEnumerable.ToList() ToList()-- Does it Create a New List?Garip, IEnumerable.ToList() oluşturur tamamen yeni nesneler

de tartışıldığı gibi, ama IEnumerable aynı orijinal maddelere işaret öğeleri ile yeni bir listesi oluşturmak gerektiğini biliyorum

Ancak, VS 2012 kullanarak kodumla bazı garip davranışlar alıyorum; WPF; ve .NET 4.0. IEnumerable.SequenceEquals() beklediğim gibi çalışmadığı zaman başladı. Benim QuickWatch iletişim etrafında kazdık ve inanılmaz aşağıdaki deyimi yanlış olarak değerlendirir: Hatta çalıştı

this.Items.First() == this.Items.ToList()[ 0 ] 

: -1 olarak değerlendirilen

this.Items.ToList().IndexOf(this.Items.First()) 

.

Items

şöyle bir WPF özel denetimi bir özelliği olarak ilan edilir:

// 
// This source code was auto-generated by xsd, Version=4.0.30319.17929. 
// 
namespace MyAssays.UserLayoutCore.UserLayoutUtility { 
    using System.Xml.Serialization; 


    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlRootAttribute("UserLayout", Namespace="", IsNullable=false)] 
    public partial class UserLayoutType { 

Bu:

public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register (
     "Items", 
     typeof (IEnumerable<UserLayoutType>), 
     typeof (UserLayoutSelectorControl), 
     new FrameworkPropertyMetadata (null, FrameworkPropertyMetadataOptions.AffectsRender, UserLayoutSelectorControl.PropertyChanged)); 


public IEnumerable<UserLayoutType> Items 
{ 
    get 
    { 
     return (IEnumerable<UserLayoutType>) this.GetValue (UserLayoutSelectorControl.ItemsProperty); 
    } 
    set 
    {  
     this.SetValue (UserLayoutSelectorControl.ItemsProperty, value);     
    } 
} 

UserLayoutType basitçe aşağıdaki bildirimi ile XSD aracı tarafından oluşturulan bir sınıf vardır KullanıcıLayoutType Öğelerini ilk olarak oluşturan bir fabrika sınıfındaki yöntemler şunlardır:

Neler olup bittiği hakkında bir fikrin var mı? görüntüsünün altında: enter image description here

+0

Merhaba, lütfen .Equals yöntemini deneyin, örn. this.Items.First(). Eşittir (this.Items.ToList() [0]) – user1778606

+0

Beyan edilen öğeler nedir? Konuştuğunuz konuları gösteren kısa ve basit bir kod parçası oluşturmayı denemek en iyisidir. Ardından, kodu sorunuza gönderin. Bunun yanı sıra == ve .Equals() – dcaswell

+0

arasındaki farkı öğrenmeniz gerekiyor. Bu this.Items dosyasının çalışma zamanı nedir? Equals' veya '==' üzerinde bir geçersiz kılma yok mu? – Blorgbeard

cevap

7

bu yeni nesneler görüyoruz neden ana, muhtemel, neden IEnumerable<T> bir materialized koleksiyon bir jeneratör sarma ve olmamasıdır.

Burada basit LINQPad programı göstermek için verilmiştir:

void Main() 
{ 
    IEnumerable<string> collection = 
     from index in Enumerable.Range(1, 10) 
     select "Index=" + index; 

    var list1 = collection.ToList(); 
    var list2 = collection.ToList(); 

    ReferenceEquals(list1[0], list2[0]).Dump(); 
} 

Bu False yazdırılır.

Bu işlem, koleksiyon üzerinde numaralandırma eylemi (bu durumda .ToList()) ertelenmiş LINQ sorgusunu yürüteceğinden ve koleksiyonu iki kez numaralandırdığımız için, bunu iki kez yürütüyoruz, aynı örnekleri kullanarak farklı örnekler üretiyoruz değerler.

İlgili konular