2014-02-16 3 views
0

Короче говоря. У меня есть следующий код:C# IEnumerable не разрешает доступ к подпунктам

class MyList : IEnumerable 
{ 
    private List<string> T1 = new List<string>(); 
    private List<string> T2 = new List<string>(); 
    private List<string> T3 = new List<string>(); 
    public List<string> Name { set { T1 = value; } get { return T1; } } 
    public List<string> DataType { set { T2 = value; } get { return T2; } } 
    public List<string> Nullable { set { T3 = value; } get { return T3; } } 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return (IEnumerator)GetEnumerator(); 
    } 
    public MyList<List<string>, List<string>, List<string>> GetEnumerator() 
    { 
     return new MyList<List<string>, List<string>, List<string>>(T1, T2, T2); 
    } 
} 

То, что я хочу, чтобы получить доступ к нему, как это:

 MyList ml = new MyList(); 
     foreach (var item in ml) 
     { 
      str = item.Name; 
     } 

Это не позволяет мне получить доступ к подэлементу, как item.Name или item.DataType.

+0

Предоставлено код дает много ошибок компиляции. Это проблема? Или у вас есть еще одна проблема? – Styxxy

+2

Возможно, вы захотите реализовать 'IEnumerable ' вместо этого. Но я думаю, что у вас большие проблемы. Возможно, вам нужен один объект класса для представления одного набора 'Name',' Datatype', 'Nullable'. –

+0

@Styxxy код не дает каких-либо проблем с компиляцией, все, что я хочу, это иметь доступ к нему, как маленький кусок кода под вопросом. – Johnny

ответ

2

Если вы действительно хотите, чтобы выставить функциональные возможности описания (3 перечислены в совокупности представляющие собой набор элементов), вы можете сделать это, но вам все еще нужно, чтобы выставить новый тип в пользу вашего перечислителем.

class MyItem 
{ 
    public string Name { get; set; } 
    public string DataType { get; set; } 
    public bool Nullable { get; set; } 
} 

class MyList : IEnumerable<MyItem> 
{ 
    public List<string> Names { get; set; } 
    public List<string> DataTypes { get; set; } 
    public List<bool> Nullables { get; set; } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return this.GetEnumerator(); 
    } 

    public IEnumerator<MyItem> GetEnumerator() 
    { 
     // assuming all lists are the same length 
     for (int i = 0; i < Names.Count; i++) 
      yield return new MyItem { 
       Name = Names[i], 
       DataType = DataTypes[i], 
       Nullable = Nullables[i] 
      }; 
    } 
} 

Теперь вы можете сделать:

MyList ml = new MyList(); 
ml.Names = new [] { "AccountNum", "Value", "Owner" } .ToList(); 
ml.DataTypes = new [] { "nvarchar(50)", "decimal(14,6)", "nvarchar(50)" } .ToList(); 
ml.Nullables = new [] { false, false, true } .ToList(); 

foreach (var item in ml) 
{ 
    str = item.Name; 
} 
+0

спасибо большое, что помогло, кстати, на самом деле это bool :) просто забыл изменить его. Еще раз спасибо – Johnny

+0

Извините, не могу повышать, мне не хватает репутации, сделаю, как только я это сделаю. – Johnny

6

Кажется, вы пытаетесь составить список вещей, каждый из которых имеет 3 свойства: Name, DataType, Nullable. Попробуйте следующее:

class MyItem 
{ 
    public string Name { get; set; } 
    public string DataType { get; set; } 
    public string Nullable { get; set; } // also, consider making this bool 
} 

Затем создайте список из них.

+0

@ CJS, что я пытаюсь сделать, есть 3 Список в классе, это похоже на индивидуальный Tuple, если у вас будет. – Johnny

+2

Вы реализуете список настраиваемых кортежей (ваше идеальное использование примеров демонстрирует это). Вместо того, чтобы использовать 3 параллельных списка для достижения цели (где T1 [0], T2 [0] и T3 [0] совместно описывают один объект), вы должны собрать три свойства в своем собственном типе. Составление списка из них тогда тривиально. – CSJ

1

На основании ответа от @CSJ, я хотел бы предложить:

public class MyItem 
{ 
    public string Name { get; set; } 
    public string DataType { get; set; } 
    public string Nullable { get; set; } // also, consider making this bool 
} 

public class MyItemList : IEnumerable<MyItem> 
{ 
    private List<MyItem> MyItems = new List<MyItem>(); 

    public IEnumerator<MyItem> GetEnumerator() 
    { 
     return this.MyItems.GetEnumerator(); 
    } 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 
} 

Пожалуйста upvote @CSJ, как это основано на его идее!

+2

Маловероятно, что OP действительно понадобится реализовать пользовательский 'IEnumerable ' вместо использования' List '. –

+0

@HighCore: +1 Правда, на случай, если OP нуждается в большей логике, заключенной в класс MyItemList. – HOKBONG

+0

@HOKBONG возможно ли MyItem не иметь собственный класс? – Johnny

Смежные вопросы