Member 11859517 Ответов: 5

Как скопировать список<T> в другой список<T1>


у меня есть класс скажи Т
class T
{
public string Name{get;set;}
public string LName{get;set;}
}

Class T1
{
public string Name{get;set;}
public string LName{get;set;}
}

List<T> T_list = new List<T>
List<T1> T1_list = new List<T1>

How to do copy 
T1_list = T_list ????


Что я уже пробовал:

я могу сделать это с помощью цикла foreach, например
T1 t1 = null;
foreach(var item in T_list)
{
t1 = new T1();
t1.Name = item.name;
t1.LName = item.LName;

T1_list(t1);
}

но у меня есть больше свойств, так что у тебя есть лучший способ сделать это.

5 Ответов

Рейтинг:
36

Maciej Los

5ed!

Рейтинг:
22

Maciej Los

Примечание: вам не нужно создавать два класса с разными именами, если их поля, члены одинаковы!

Например:

class T
{
public string Name{get;set;}
public string LName{get;set;}
}

//usage:
List<T> firstlist = new List<T>();
List<T> secondlist = new List<T>();

//copy data from first list
secondlist.AddRange(firstlist);


Для получения более подробной информации, пожалуйста, смотрите: Список<T>.AddRange(IEnumerable<T>) Метод (Система.Коллекции.Общая) | Майкрософт Документы[^]


Рейтинг:
1

Benktesh Sharma

Если вам нужно составить список смешанного типа, то вы должны составить оба списка объекта. Поскольку каждый класс является производным от объекта, список достаточно универсален, чтобы содержать что-либо. можно сделать что-то вроде ниже:

public class T
{
    public string Name { get; set; }
    public string LName { get; set; }
}

public class T1
{
    public string Name { get; set; }
    public string LName { get; set; }
}

List<object> T_list = new List<object>();
List<object> T1_list = new List<object>();

T_list.Add(new T { Name = "T_firstName", LName = "T_FirstName" });
T1_list.Add(new T1 { Name = "T1_firstName", LName = "T1_LastName" });

T1_list.AddRange(T_list);


Теперь T1_list содержит оба элемента из T_list и T1_list и теперь является смешанным типом (т. е. T и T1).


Рейтинг:
1

saberw

Автоматически скопировать все поля и свойства класса в другой класс Т1


Вы должны использовать Отражение и Способ расширения.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace runtimesetval
{


    static class ObjectExtensions
    {
      
        public static void CopyAllFieldsTo(this object obj, object src)
        {

            //Getting Type of Src
            Type tModelType = src.GetType();
            BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | 
                BindingFlags.SetField | BindingFlags.SetProperty;
            //We will be defining a PropertyInfo Object which contains details about the class property 
            PropertyInfo[] arrayPropertyInfos = tModelType.GetProperties(flags);


            //Now we will loop in all properties one by one to get value
            foreach (PropertyInfo property in arrayPropertyInfos)
            {
               
                PropertyInfo pi = obj.GetType().GetProperty(property.Name);

                if (pi != null && pi.CanWrite)
                {
                    pi.SetValue
                    (
                        obj,
                        Convert.ChangeType(property.GetValue(src, null), pi.PropertyType),
                        null
                    );
                }



            }




        }

    }

    class TestObject
    {
        public string p1 { get; set; }
        public int p2 { get; set; }
    }



    class TestObject1
    {
        public string p1 { get; set; }
        public int p2 { get; set; }
        public string p3 { get; set; }
        public int p4 { get; set; }
    }




    class Program
    {
        static void Main(string[] args)
        {
            TestObject o = new TestObject();
            TestObject1 o1 = new TestObject1();


            o.p1 = "o.p1";
			o.p2 =1;
			
            o1.p1 = "o1.p1"; 
            o1.p2 =2;

			
			
			//Copy all fields values from o(TestObject) to o1(TestObject1)
			
            o1.CopyAllFieldsTo(o);


			//Copy all fields values from o1(TestObject1) to o(TestObject)
			
            o.CopyAllFieldsTo(o1);



            
            Console.ReadKey();
            
        }
    }
}


Рейтинг:
0

Christian Graus

Поскольку у вас есть два разных класса, самое простое, что я думаю, - это создать конструктор на T1, который берет T и строит T1 из T. Это помещает этот код в класс, где он принадлежит, и Вы можете использовать его в любом месте с помощью T1_list.Добавить(новый T1(элемент).

T1_list(t1);


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