IEnumerable.ToList() が新しいリストを作成することになっていることは知っていますが、 ToList()で説明されているように、項目は IEnumerable 内の同じ元の項目を指しています。新しいリストを作成しますか?
ただし、VS 2012 を使用したコードで奇妙な動作が発生しています。WPF; および.NET 4.0。IEnumerable.SequenceEquals() が期待どおりに機能しないように見えたときに始まりました。QuickWatch ダイアログを調べてみたところ、信じられないことに、次のステートメントは false と評価されました。
this.Items.First () == this.Items.ToList ()[ 0 ]
私も試しました:
this.Items.ToList ().IndexOf(this.Items.First ())
-1に評価されました。
Items
次のように、WPF カスタム コントロールのプロパティとして宣言されます。
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 は、次の宣言を使用して、XSD ツールによって生成された単純なクラスです。
//
// 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 {
これは、最初に UserLayoutType 項目を作成するファクトリ クラスのメソッドです。
public static IEnumerable<UserLayoutType> CreateFromFolder ( string folderPath )
{
if (String.IsNullOrEmpty(folderPath))
throw new ArgumentNullException("folderPath", "Folder path must not be null");
var userLayoutXmlFilePaths = Directory.GetFiles ( folderPath ).Where ( filePath => filePath.EndsWith ( ".UserLayout.xml", StringComparison.InvariantCultureIgnoreCase ) );
return userLayoutXmlFilePaths.Select(filePath => UserLayoutFactory.CreateFromFile(filePath));
}
public static UserLayoutType CreateFromFile ( string filePath )
{
using ( var stream = new StreamReader ( filePath ) )
{
return ( UserLayoutType ) new XmlSerializer ( typeof ( UserLayoutType ) ).Deserialize ( stream );
}
}
何が起こっているのか誰にも分かりますか?下の画像を参照してください。