2015-03-02 2 views
1

У меня есть два класса - Record и RecordModifiedПреобразование от типа списка к другому типу

public class Record 
{ 
    public int RecordID { get; set; } 
    public int FacilityID { get; set; } 
    public int NewAID { get; set; } 
    public string OldID { get; set; } 
    public string Data { get; set; } 
    public int SyncStatusID { get; set; } 
    public int RecordTypeID { get; set; }//RecordTypeID is integer here. 

} 

Второй класс

public class RecordModified 
{ 
    public int RecordID { get; set; } 
    public int FacilityID { get; set; } 
    public int NewAID { get; set; } 
    public string OldID { get; set; } 
    public string Data { get; set; } 
    public int SyncStatusID { get; set; } 
    public string RecordTypeText { get; set; }//RecordTypeText is string here. 
} 

У меня есть список записи, по меньшей мере, 100 Record объектов, теперь мне нужно преобразовать List<Record> в List<RecordModified>. Свойство RecordTypeID класса Record должно быть преобразовано в недвижимость RecordTypeText из RecordModified с использованием enum s, которые находятся в другом классе.

Фрагмент кода о том, как я пытаюсь преобразовать:

foreach(Record r in List<Record>) 
{ 
    switch(r.RecordTypeID) 
    { 
    case (int)MyEnum.One: 
    listofRecordModified.Add(new RecordModified{RecordTypeID=r.RecordTypeID,...,**RecordTypeText=(MyEnum.One).ToString()})** // Notice this 
    break; 
    ...........//75 more cases. 
    } 

Это решение работает хорошо, но проблема много кодов, и я не думаю, что его эффективным. Должен быть лучший способ сделать это. Пожалуйста, предложите.

+1

@Patrick Хофман ... Спасибо за редактирование – dividedbyzero

ответ

3

Я думаю, что вы можете использовать ConvertAll метод наряду с этим

List<Record> t = new List<Record>(); 

      var result = t.ConvertAll(x => new RecordModified() 
       { 
        RecordTypeText = ((MyEnum)x.RecordTypeID).ToString() 
       }); 
+0

Решение отлично поработало, спасибо. Можете ли вы предложить хороший учебник для понимания выражения лямбды. – dividedbyzero

2

Если ваша единственная проблема заключается в преобразовании индекса enum в текст, вы можете использовать GetNames и использовать индекс, чтобы получить имя значения enum используется.

string text = Enum.GetNames(typeof(MyEnum))[r.RecordTypeID]; 

Таким образом, вам не нужно switch заявления, и вы можете вернуться к только одной строке.

0

Я считаю, что у вас есть инструкция switch для каждого значения MyEnum? Это много повторяющегося кода, это правда.

Почему бы вам просто не преобразовать int в текстовое значение напрямую?

Вы можете сделать это, как это для более читабельности

foreach(Record r in List<Record>) 
     { 
      MyEnum myEnum = (MyEnum)r.RecordTypeID; 
     string stringValue = myEnum .ToString(); 
     listofRecordModified.Add(new RecordModified{RecordTypeID=r.RecordTypeID, ...,**RecordTypeText=stringValue })** // Notice this 

     } 
2

Вы можете просто использовать можно сделать с помощью (MyEnum)x.RecordTypeID бросить целое значение для сопоставления enum значение. а затем используйте это значение .ToString(), чтобы получить строковое значение. Linq Lambda expressions, как показано ниже,

var result = RecordList.Select(x=>new RecordModified{ 
           RecordTypeID=x.RecordTypeID, 
           ..., 
           RecordTypeText=((MyEnum)x.RecordTypeID).ToString() 
          }); 

Вы также можете использовать ConvertAll как,

var result = RecordList.ConvertAll(x => new RecordModified() 
       { 
        RecordTypeText = ((MyEnum)x.RecordTypeID).ToString() 
       }); 

Select является LINQ extension метод и работает на всех IEnumerable<> объектов, тогда как ConvertAll осуществляется только List<>. Метод ConvertAll существует с .NET 2.0, тогда как LINQ был введен с 3.5.

Вы должны одобрить Select над ConvertAll, поскольку он работает для любого вида списка, но они делают то же самое в основном.

+0

решение работало большим, спасибо. Можете ли вы предложить хороший учебник для понимания выражения лямбды. – dividedbyzero

+1

@dividedbyzero: Как насчет [руководства по программированию на C#] (https://msdn.microsoft.com/en-us/library/bb397687.aspx)? –

+0

@patrick Hofman .... Спасибо, сэр – dividedbyzero

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