【问题标题】:copy user's selected items of one list to another by index按索引将用户从一个列表中选择的项目复制到另一个列表
【发布时间】:2012-07-26 19:36:51
【问题描述】:

我有一个包含 16 个字符串的字符串列表。用户选择将此列表中索引为 0,5,6,10,15 的项目复制到第二个 List 中。

linq 有没有办法做到这一点?

【问题讨论】:

    标签: asp.net linq list


    【解决方案1】:

    假设您已经在集合中拥有索引,您可以使用Enumerable.ElementAt,它只使用IList<T> 的索引器,因此它非常有效:

    var indices = new List<int>(){ 0,5,6,10,15 };
    List<String> result = indices.Select(i => strings.ElementAt(i)).ToList();
    

    如果您不想创建新列表而是将它们复制到现有列表中:

    other.AddRange(indices.Select(i => strings.ElementAt(i)));
    

    【讨论】:

    • 谢谢,性能怎么样?这种方法是否比 2 个嵌套的 foreach 循环具有更好的性能?
    • @raza:你量过吗,是不是太慢了?使用最具可读性和可维护性的东西,而不是在 100 万次迭代中快 1 毫秒的东西。在内部,Linq 也使用循环,但它不会变慢,因为 ElementAt 使用索引器 (strings[15]) 来处理 IList&lt;T&gt; 之类的列表或数组。
    • @raza:除此之外,对于 classic 方式,您不需要两个嵌套的 foreachforeach(int i in indices)other.Add(strings[i]);
    【解决方案2】:
    var list = new List<string> {"sdf", "sdfsd", "fdgfdgfhg"};
    var result = list.Where(x => list.IndexOf(x) == 1 || list.IndexOf(x) == 2).ToList();
    

    但我不建议这样做,这个任务 dot'n for linq

    【讨论】:

      【解决方案3】:

      还可以使用 Where 扩展方法的以下重载:

      var string_list = new List<string>() { "0", "1", "2", "3", "4", "5" };
      var index_list = new List<int>() { 0, 2, 3 };
      foreach (string result in string_list.Where((s, i) => index_list.Contains(i)))
          Console.WriteLine(result);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多