2012-06-01 7 views
2

내가 추적 유지해야하는 프로젝트를 진행하고 각 루트 항목에 여러 다른 식별자 유형의 아이들 (INT가 필요 어떤 종류의 데이터 구조를 사용할 수 있습니까?

  • 단지 문자열 이름의

    • 5-6 루트 항목을 문자열, 부동 등). 하나의 루트의 모든 하위 유형은 같지만 각 루트는 다른 하위 유형을 갖습니다.
    • 사용자는 각 루트에서 하위를 추가/삭제할 수 있어야합니다.
    • 나중에 개별적으로 액세스해야합니다. 필요한 경우 문자열 조작 및 구문 분석

    키가 문자열이고 값이 개체 목록 인 사전을 사용하고 있다고 생각했습니다. 또는 각 루트 항목과 각 클래스에 대해 고유 한 클래스를 갖는 것은 자식 목록을 포함합니다.

    누구에게 좋은 제안이 있습니까? 나는 아직도 OOP에 새로운거야, 나와 함께 곰 :

    고마워!

  • +3

    하는 사전 <문자열 목록 은> 당신이 찾고있는 것 같다. – CodeHxr

    +0

    주어진 루트의 모든 자식이 같은 유형인지 * 적용하도록 하시겠습니까? 나는 그 일을 할 수있는 방법을 찾기 위해 고심하고 있습니다. 만약 당신이 그 수준의 유형 집행없이 살기를 원한다면'Dictionary >'이 작동 할 것입니다. –

    +0

    주어진 루트의 자식은 같은 유형일 필요는 없습니다. 실제로는 그렇지 않은 경우 더 좋을 수 있습니다. 그래서 튜플을 사용하면, 내가 원하는 유형의 항목을 동적으로 추가/삭제할 수 있습니까? – jerbotron

    답변

    6
    public interface IRoot {} 
    
    public class RootItem<T> : IRoot 
    { 
        public string Name { get; set; } 
        public List<T> Children {get; set; } 
    } 
    

    그리고 Dictionary<string, IRoot>을 모두 보관하십시오.

    Dictionary<string, IRoot> hair = new Dictionary<string, IRoot>(); 
    hair.Add(
        new RootItem<int>() 
         { 
         Name = "None", 
         Children = new List<int>() {1, 2, 3, 4} 
         } 
    ); 
    
    hair.Add(
        new RootItem<decimal>() 
         { 
         Name = "None", 
         Children = new List<decimal>() {1m, 2m, 3m, 4m} 
         } 
    ); 
    
    +0

    위대한 작품. – CodeHxr

    +0

    감사합니다. 기록을 위해 @FishBasketGordo는 훨씬 더 유연한 샘플을 제공했습니다. – bluevector

    +0

    generic 인수가없는'RootItem'이 불완전한 유형이기 때문에'Dictionary '이 유효하지 않습니다. – FishBasketGordo

    0

    Dictionary<string, Tuple<type1, type 2, etc>>과 같은 소리가 좋은 후보입니다.

    키는 문자열 (루트)입니다. 루트에있는 자식은 Tuple입니다. 튜플에 항목을 추가 할 수 있습니다. 이걸 지적 주셔서 감사합니다.

    Good starting point on Tuple

    +0

    런타임에 튜플에 항목을 추가하거나 제거 할 수 없습니다. –

    +0

    @MichaelEdenfield 이것을 지적 해 주셔서 감사합니다. 수정 됨. – Sandeep

    +0

    'Tuple '구조는 이기종의'Dictionary' 값을 허용하지만 @swifferclean은 각 값이 항목이 같은 유형 인 임의의 목록이라고 언급합니다. 가치 목록의 유형은 다양해야합니다. – bluevector

    2

    아이들 포함하는 방법 List<T>와 일반 클래스에 대한 : 한 개체의 모든 뿌리를 유지하려면

    public class Root<T> 
    { 
        private List<T> children = null; 
    
        public Root(string name) 
        { 
         Name = name; 
        } 
    
        public string Name { get; set; } 
    
        public List<T> Children 
        { 
         get 
         { 
          if (children == null) 
          { 
           children = new List<T>(); 
          } 
    
          return children; 
         } 
        } 
    } 
    
    Root<int> intRoot = new Root<int>("IntRoot"); 
    intRoot.Children.Add(23); 
    intRoot.Children.Add(42); 
    
    Root<string> stringRoot = new Root<string>("StringRoot"); 
    stringRoot.Children.Add("String1"); 
    stringRoot.Children.Add("String2"); 
    stringRoot.Children.Add("String3"); 
    stringRoot.Children.Add("String4"); 
    

    , 당신이 당신의 자신의 클래스를 작성하거나 사용할 수를 Tuple :

    var rootGroup = Tuple.Create(intRoot, stringRoot); 
    // intRoot is accessible as rootGroup.Item1 
    // stringRoot is accessible as rootGroup.Item2 
    
    +0

    이것은 내가 생각해 낸 것입니다. 그러나 OP는 또한 가능하지 않은'Dictionary '을 원합니다. 당신은 기본이 아닌'RootItem' 클래스를 가질 수 있습니다. 그러나 프로세스 내에서 타입 안전성을 잃을 것입니다 ... –

    +0

    프로그래밍 지식이 부족하다는 것에 유감스럽게 생각합니다! intRoot 및 stringRoot를 등호 기호의 오른쪽에 선언하면 기본적으로 Root (문자열 이름) 함수를 호출하고 있습니까? 또는 .. 생성자로 간주되는 클래스의 루트 (문자열 이름) "것"입니까? – jerbotron

    +0

    이것은 생성자입니다. 'new' 연산자를 볼 때마다, 당신은 생성자를 다루고 있습니다. 또한 클래스와 이름이 같고 명시적인 반환 유형이 없기 때문에 클래스 자체를 살펴봄으로써 생성자임을 알 수 있습니다. – FishBasketGordo

    0

    여기에 대한 한 가지 방법이 있습니다. 이 일이 필요 캐스팅을 많이하지만 그것은 일을 가져옵니다 언뜻

    static void Main(string[] args) 
        { 
         Dictionary<string, IRootCollection> values = new Dictionary<string, IRootCollection>(); 
    
         values["strings"] = new RootCollection<string>(); 
         (values["strings"] as RootCollection<string>).Add("foo"); 
         (values["strings"] as RootCollection<string>).Add("bar"); 
    
         values["ints"] = new RootCollection<int>(); 
         (values["ints"] as RootCollection<int>).Add(45); 
         (values["ints"] as RootCollection<int>).Add(86); 
        } 
    
        interface IRootCollection { } 
        class RootCollection<T> : List<T>, IRootCollection { } 
    
    관련 문제