2012-01-26 4 views
1

나는 usercontrol에 맞게 만든 구조체가 있습니다. 내 생각에 내가 공공 재산 Guid Dictionary<string, Guid> Attachments을 가지고 그 다음 그것을 내 개인 List<Attachment> attachments the setter로 변환했다. 나는 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(); 

내가 강하게이를 사용에서 당신을 낙담 것 mutable 구조체 비록. 구조체 자체가 너무 나쁘지 않다 사용,하지만 난으로 변경 것 ...

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(); 
관련 문제