共享关于List的几个常用方法

本文介绍了一段Java代码,展示了如何将List平均分成两个子List,按照特定参数大小分组,以及从List中随机抽取指定数量的记录。代码简洁高效,适合Java开发者学习。

// 把一个List平均分成二个List
 public static List[] splitList(List list) {
  ArrayList left = new ArrayList();
  ArrayList right = new ArrayList();
  ArrayList[] result = new ArrayList[2];
  if (null == list || list.size() == 0)
   return result;
  for (int i = 0; i < list.size(); i++) {
   if (i % 2 == 0) {
    left.add(list.get(i));
   }
   else {
    right.add(list.get(i));
   }
  }
  result[0] = left;
  result[1] = right;
  return result;
 }



 // 把一个List按照size的大小分组;
 public static List splitListByParameter(List list, int size) {
  if (null == list || list.size() == 0 || size == 0)
   return null;
  int arraySize = 0;
  if (list.size() % size == 0)
   arraySize = list.size() / size;
  else
   arraySize = list.size() / size + 1;

  List result = new ArrayList(arraySize);
  int temp = 0;
  while (temp < arraySize) {
   try {
    if (temp == arraySize - 1)
     result.add(list.subList(temp * size, list.size()));
    else
     result.add(list.subList(temp * size, temp * size + size));
   }
   catch (RuntimeException e) {
    e.printStackTrace();
   }
   temp++;
  }
  return result;
 }




/**
  * 从一个LIST中随机获取size条记录,返回值LIST;
  * 
  */
 public static List getRandomRecords(List list , int size) {
  if(list==null||list.size()<=size) return list ;
  List result = new ArrayList();
  Random random = new Random();
  while(result.size()<size){
  Object obj = list.get(random.nextInt(list.size()));
  if(!result.contains(obj)){
  result.add(obj);
  }
  }
  return result ;
 } 
<think> 我们讨论的是C#中的List复制问题。根据用户的需求,他想知道如何将一个List复制到另一个List。需要注意的是,复制有浅拷贝和深拷贝之分。 引用[2]中提到,如果List中存放的是引用类型,那么直接复制(如使用构造函数、ToList()或循环添加)都是浅拷贝,即两个列表中的元素指向同一个对象。修改一个列表中的对象属性会影响另一个。 引用[4]中展示了使用GetRange方法进行部分复制,但同样也是浅拷贝。 用户要求的是复制整个列表,我们可以提供多种方法,并指出它们是浅拷贝还是深拷贝。 方法总结: 1. 使用List的构造函数:new List<T>(originalList) —— 浅拷贝 2. 使用ToList()扩展方法:originalList.ToList() —— 浅拷贝 3. 使用AddRange方法:newList.AddRange(originalList) —— 浅拷贝 4. 循环遍历并逐个添加:foreach循环添加 —— 浅拷贝 5. 使用CopyTo方法(但注意,CopyTo是复制到数组,不是直接复制到另一个List)—— 我们可以利用它先复制到数组,然后再用数组创建List,但这样也是浅拷贝。 如果用户需要深拷贝,那么需要序列化或者手动创建新对象。 根据引用[2]的示例,我们需要注意浅拷贝带来的影响。 因此,回答将分为两个部分:浅拷贝方法和深拷贝方法。 </think>在 C# 中,将一个 `List` 复制到另一个列表有几种常用方法,主要分为**浅拷贝**和**深拷贝**两种类型,需根据具体需求选择: --- ### 一、浅拷贝方法(复制引用) 适用于值类型或不需要独立修改引用对象内容的场景: ```csharp List<ProjectListVo> originalList = new List<ProjectListVo>(); // 原始列表 // 1. 使用构造函数复制 List<ProjectListVo> copy1 = new List<ProjectListVo>(originalList); // 2. 使用 LINQ 的 ToList() List<ProjectListVo> copy2 = originalList.ToList(); // 3. 使用 AddRange List<ProjectListVo> copy3 = new List<ProjectListVo>(); copy3.AddRange(originalList); // 4. 使用 GetRange(复制指定范围) List<ProjectListVo> copy4 = originalList.GetRange(0, originalList.Count); ``` > ⚠️ **浅拷贝特性** > 以上方法仅复制元素引用,修改新列表中的对象属性会影响原列表: > ```csharp > copy1[0].Name = "修改后"; > Console.WriteLine(originalList[0].Name); // 输出"修改后" > ``` --- ### 二、深拷贝方法(完全独立副本) 当元素为引用类型且需要完全独立时: #### 1. 手动克隆(推荐) ```csharp List<ProjectListVo> deepCopy = originalList .Select(item => new ProjectListVo { Id = item.Id, // 复制值类型属性 Name = item.Name, // ... 其他属性 }).ToList(); ``` #### 2. 序列化反序列化(需引用 `System.Text.Json`) ```csharp using System.Text.Json; string json = JsonSerializer.Serialize(originalList); List<ProjectListVo> deepCopy = JsonSerializer.Deserialize<List<ProjectListVo>>(json); ``` #### 3. 实现 `ICloneable` 接口 ```csharp public class ProjectListVo : ICloneable { public object Clone() => new ProjectListVo { Id = this.Id, Name = this.Name, // ... }; } // 使用克隆 List<ProjectListVo> deepCopy = originalList .Select(item => (ProjectListVo)item.Clone()) .ToList(); ``` --- ### 三、方法对比 | 方法 | 拷贝类型 | 是否独立 | 性能 | 适用场景 | |--------------------|----------|----------|----------|-----------------------| | `new List<T>(源)` | 浅拷贝 | ❌ | ⚡️ 最快 | 简单值类型或共享对象 | | `ToList()` | 浅拷贝 | ❌ | ⚡️ 快 | LINQ 查询结果复制 | | 手动克隆 | 深拷贝 | ✅ | ⚡️ 快 | 完全控制复制过程 | | JSON序列化 | 深拷贝 | ✅ | ⚠️ 较慢 | 复杂对象无需手动实现 | > 💡 **最佳实践建议** > 1. 对于**值类型**(如 `int`, `string`, `struct`)直接使用浅拷贝 > 2. 对于**引用类型**且需修改独立性时,优先选择手动克隆 > 3. 避免循环中频繁深拷贝,可能引发性能问题 [^1][^2][^3][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值