【问题标题】:How to copy some fields of a List To some fields of another List without a foreach loop?如何在没有foreach循环的情况下将列表的某些字段复制到另一个列表的某些字段?
【发布时间】:2013-10-15 02:30:48
【问题描述】:

我想知道是否可以使用 c# 将一个列表复制到另一个列表而不执行 foreach 循环,我找到了这个链接:

How do I copy items from list to list without foreach?

Jon Skeet 在哪里发布了这个答案:

targetList.AddRange(sourceList);

访问此链接后,我遇到了一个新问题,即是否可以将列表的某些字段复制到另一个列表的某些字段中,其中两个列表的架构不同而不执行 foreach 循环?

【问题讨论】:

  • 取决于这两种物品类型是否可以相互构造。你不使用foreach真的那么重要吗?
  • 我猜你可以使用 linq,但它仍然会循环遍历数组。
  • “字段”是什么意思? “字段”在 C# 中是一个非常具体的术语,我很确定您在这里不是指这种解释。如果您指的是列表中的项目,请将它们称为项目以避免混淆。
  • @FredericHamidi 假设是的!我很担心表现,也很想知道有没有办法
  • 使用 LINQ 解决此问题的任何方法都将编译为 foreach 循环。 你没有看到循环这一事实并不意味着没有循环

标签: c# list


【解决方案1】:

你可以这样做:

targetlist.AddRange(sourceList.ConvertAll(x => new targetItem(){prop1 = x.prop1, prop2 = x.prop2}));

在幕后循环仍在发生,但代码看起来更整洁!

【讨论】:

  • 你为什么要转换?我认为 OP 有两个具有相同项目类型的列表。
  • 他在最后一段中说它们可能是不同的类型
  • 哦,是的,对不起......“列表模式”。我的错。
  • 太棒了!这正是我的意思和需要!
【解决方案2】:

如果您想将某些特定条目从 ListA 复制到 ListB 中,您可以使用 LINQ 从 ListA 中检索条目

`var entriesToCopy = from item in ListA
                    where item.Property == "SomeValue"
                    select item;`

关于您关于“两个列表的架构不同”的架构的陈述。如果您谈论的是 List 类型,它们实际上并没有“架构”,它们只是对象的集合,因此您需要根据 entriesToCopy 的结果在 ListB 中转换、转换、创建相同类型的对象。

如果您在 ListA 的对象中指定了转换,则可以使用

.AddRange(entriesToCopy.Cast<ObjectTypeB>())

【讨论】:

    【解决方案3】:

    你可以使用以下

    Struct Foo
    {
    public string Bar1;
    public string Bar2
    }
    
    void SomeMethod()
    {
    List<Input> input = new List<Input>();
    List<Foo> output = new List<Foo>();
    
    output = input.Select(a => new Foo(){Bar1 = a.bar1, Bar2 = a.bar2});
    }
    

    【讨论】:

      【解决方案4】:

      如果您知道列表的大小,则可以执行以下操作:

      var list1 = new List<int> {1, 2, 3}
      var list2 = new List<int> {0, 0, 0, 1, 1, 1} // <-- Notice different "schema"
      
      list2[3] = list1[0]; // <--
      list2[4] = list1[1]; // <--
      list2[5] = list1[2]; // <-- Notice no loops
      

      也许它不是最好的解决方案,但它满足您的要求。

      在任何其他情况下,无论使用哪种方法,您都必须显式或隐式地遍历列表。但是,您可以使用一些并行化来使事情更加健壮。

      【讨论】:

        猜你喜欢
        • 2021-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        相关资源
        最近更新 更多