【问题标题】:how to split list using linq如何使用 linq 拆分列表
【发布时间】:2010-10-07 09:09:38
【问题描述】:

我有 int 列表,其中包含值 0,0,0,1,2,3,4,0,0 现在我喜欢将其拆分为 3 个列表,例如此列表 A 包含 0,0,0 和列表B 由 1,2,3,4 组成,列表 C 由 0,0 组成。我知道如何使用 if 和 for 进行拆分,但我如何使用 linq 来做到这一点。通常的格式我需要拆分开始一些零和中间一些值,最后一些零我需要在一个列表中拆分第一个零,在一个列表中拆分中间值并在另一个列表中结束零,正如我在上面的示例中所说,这里使用 linq而且我也喜欢取值的索引。

【问题讨论】:

  • 您还没有说如何 拆分数据。为什么要以这种方式拆分,而不是 {0,0,0,1}、{2,3,4,0}、{0}?
  • 请向我们提供有关拆分标准的更多详细信息。它只是分开的零和非零序列吗?

标签: c# linq


【解决方案1】:

第一个。

myList.TakeWhile(x => x==0)

第二个。

myList.SkipWhile(x => x==0).TakeWhile(x => x!= 0)

第三个。

myList.SkipWhile(x => x==0).SkipWhile(x => x!= 0)

【讨论】:

    【解决方案2】:

    如果您想按零序列拆分,请尝试以下代码:

    static void Main(string[] argv)
    {
    
        var list = new[] { 0, 0, 0, 1, 2, 3, 4, 0, 0 };
    
        int groupIndex = 0;
        var result = list.Select(
            (e, i) =>
                {
                    if (i == 0)
                    {
                        return new {val = e, group = groupIndex};
                    }
                    else
                    {
                        groupIndex =
                            (e != 0 && list[i - 1] == 0) || (e == 0 && list[i - 1] != 0)
                                ?
                                    groupIndex + 1
                                : groupIndex;
    
                        return new {val = e, group = groupIndex};
                    }
                }
            ).GroupBy(e => e.group).Select(e => e.Select(o => o.val).ToList()).ToList();
    
        foreach (var item in result)
        {
            foreach (var val in item)
            {
                Console.Write(val + ";");
            }
            Console.WriteLine();
            Console.WriteLine("Count:" + item.Count);
            Console.WriteLine();
        }
    
        Console.ReadLine();
    }
    

    输出是:

    0;0;0;
    Count:3
    
    1;2;3;4;
    Count:4
    
    0;0;
    Count:2
    

    目前还不清楚从您的问题中拆分的标准是什么。如果我给出了错误的答案,请解释您的问题。

    【讨论】:

      【解决方案3】:

      您可以使用 Linq 向 Objects 公开的 Skip 和 Take 方法来抓取序列的某些元素。

      var myList = new int[] {0,0,0,1,2,3,4,0,0};
      var list1 = myList.Take(3);
      var list2 = myList.Skip(3).Take(4);
      var list3 = myList.Skip(7);
      

      【讨论】:

        【解决方案4】:

        你可以在 linq 中使用 Take(n)Skip(n)

        List<int> list = new List<int>();
                        list.Add(0);
                        list.Add(0);
                        list.Add(0);
                        list.Add(1);
                        list.Add(2);
                        list.Add(3);
                        list.Add(4);
                        list.Add(0);
                        list.Add(0);
        
                        var listOne = list.Take(3);
                        var listSecond = list.Skip(3).Take(4);
                        var listThird = list.Skip(7);
        

        【讨论】:

          猜你喜欢
          • 2010-09-29
          • 1970-01-01
          • 1970-01-01
          • 2020-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多