2012-01-26 9 views
1

私はusercontrol用に作成した構造体を持っています。私の考えは、私が公共の財産Guid Dictionary<string, Guid> Attachmentsを持っていて、それをセッターのプライベートList<Attachment> attachmentsに変換するということでした。私はそれを行うことができない、好ましくはlinqで問題を抱えていますが、私は選択肢があります。 ...ありがとう辞書をリストに変換する<struct>

private List<Attachment> attachments; 
public struct Attachment 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 
public Dictionary<string, Guid> Attachments 
{ 
    get { return attachments.ToDictionary(a => a.Name, a => a.Id); } 
    set { attachments = new List<Attachment> // not sure what to do here } 
} 
+2

このように 'List 'を公開しているのはなぜですか?あなたの 'get'と' set'の両方は、いくつかの要素よりも大きなものに対しては非常に高価になります。何も得られていないようです。 – Yuck

+0

@Yuck私はまだ学んでいますが、何をお勧めしますか?私のusercontrolには、今後添付ファイルのIDと名前、さらに多くのプロパティが必要です。私はちょうど辞書と一緒に行くことができ、構造体をまったく使用しないと思うが、私はあなたの提案を聞きたい。 Thanks Yuck – bflemi3

答えて

5

これが有効な設計(私は本当にそれについて考えていない)私は疑いあなたがしたいと仮定すると:

attachments = value.Select(pair => new Attachment { Id = pair.Value, 
                Name = pair.Key }) 
        .ToList(); 

私はが強くを使用してからあなたを阻むだろう変更可能な構造体です。構造体を使用すること自体は悪くないですが、私はそれを変更したい:

public struct Attachment 
{ 
    private readonly Guid id; 
    private readonly String name; 

    public Guid Id { get { return id; } } 
    public string Name { get { return name; } } 

    public Attachment(Guid id, string name) 
    { 
     this.id = id; 
     this.name = name; 
    } 
} 

...変換だけであるその時点で:

attachments = value.Select(pair => new Attachment(pair.Value, pair.Key)) 
        .ToList(); 
+0

@JonSkeetキーの値のペアをGuidの文字列に変更しました。あなたが正しいのは理にかなっています。ありがとうJon – bflemi3

+0

@ JonSkeetなぜこの構造が私が使用していた基本的な構造より優れているか説明してもらえますか?ありがとうございます – bflemi3

+1

@ bflemi3:開始のためのhttp://stackoverflow.com/questions/441309/why-are-mutable-structs-evilを参照してください。 –

3

私はあなたがしたいと思う:

attachments = value.Select(kvp => new Attachemnt { Id = kvp.Value, Name = kvp.Key }) 
        .ToList(); 
関連する問題