Как скопировать элементы из списка в список без foreach? - PullRequest
282 голосов
/ 23 декабря 2009

Как передать элементы, содержащиеся в одном List, в другой в C # без использования foreach?

Ответы [ 7 ]

515 голосов
/ 23 декабря 2009

Вы можете попробовать это:

List<Int32> copy = new List<Int32>(original);

или, если вы используете C # 3 и .NET 3.5, с Linq, вы можете сделать это:

List<Int32> copy = original.ToList();
161 голосов
/ 23 декабря 2009

Чтобы добавить содержимое одного списка в другой, который уже существует, вы можете использовать:

targetList.AddRange(sourceList);

Если вы просто хотите создать новую копию списка, см. Ответ Лассе.

31 голосов
/ 10 мая 2012

Для списка элементов

List<string> lstTest = new List<string>();

lstTest.Add("test1");
lstTest.Add("test2");
lstTest.Add("test3");
lstTest.Add("test4");
lstTest.Add("test5");
lstTest.Add("test6");

Если вы хотите скопировать все элементы

List<string> lstNew = new List<string>();
lstNew.AddRange(lstTest);

Если вы хотите скопировать первые 3 элемента

List<string> lstNew = lstTest.GetRange(0, 3);
5 голосов
/ 24 августа 2016

И это если вам нужно скопировать одно свойство в другой список:

targetList.AddRange(sourceList.Select(i => i.NeededProperty));
4 голосов
/ 03 апреля 2015

Этот метод создаст копию вашего списка, но ваш тип должен быть сериализуемым.

Использование:

List<Student> lstStudent = db.Students.Where(s => s.DOB < DateTime.Now).ToList().CopyList(); 

Метод:

public static List<T> CopyList<T>(this List<T> lst)
    {
        List<T> lstCopy = new List<T>();
        foreach (var item in lst)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, item);
                stream.Position = 0;
                lstCopy.Add((T)formatter.Deserialize(stream));
            }
        }
        return lstCopy;
    }
0 голосов
/ 30 августа 2017

ОК, это работает хорошо Из приведенных выше предложений GetRange () не работает для меня со списком в качестве аргумента ... так что немного подсластите посты выше: (спасибо всем:)

/*  Where __strBuf is a string list used as a dumping ground for data  */
public List < string > pullStrLst( )
{
    List < string > lst;

    lst = __strBuf.GetRange( 0, __strBuf.Count );     

    __strBuf.Clear( );

    return( lst );
}
0 голосов
/ 21 марта 2011

Здесь другой метод, но он немного хуже по сравнению с другим.

List<int> i=original.Take(original.count).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...