【问题标题】:Iterating through c# array & placing objects sequentially into other arrays遍历 c# 数组并将对象按顺序放入其他数组中
【发布时间】:2011-12-21 19:44:28
【问题描述】:

好的,这看起来很简单,但我想不出一个简单的解决方案; 基本上,我在 C# 中有一个对象数组,其中包含 102 个元素。然后我还有 4 个其他空数组。我想遍历原始数组并均匀分配 100 个元素,然后将 101 和 102 分别分配到第一个和第二个新数组。

int i = 1,a=0, b=0, c=0, d = 0;

foreach (ReviewStatus data in routingData)
{
    if (i == 1)
    {
        threadOneWork[a] = data;
        a++;
    }
    if (i == 2)
    {
        threadTwoWork[b] = data;
        b++;
    }
    if (i == 3)
    {
        threadThreeWork[c] = data;
        c++;
    }
    if (i == 4)
    {
        threadFourWork[d] = data;
        d++;
        i = 0;
    }
    i++;

}

现在上面的代码肯定可以了,但是我很好奇,有人知道更好的方法吗??

【问题讨论】:

    标签: c# arrays loops foreach


    【解决方案1】:
    var workArrays = new[] { 
        threadOneWork,
        threadTwoWork,
        threadThreeWork,
        threadFourWork, 
    };
    
    for(int i=0; i<routingData.Length; i++) {
        workArrays[i%4][i/4] = routingData[i];
    }
    

    【讨论】:

    • 这其实有点性感 ;)
    • 数学有时很有意义。
    • @msarchet - 我不会说“性感”,但我会说“适度有吸引力”...
    • @ChaosPandion 这显然很简单。并且没有总是有趣的 LINQ。
    • 哈哈谢谢大家的建议,这肯定会被用来代替我原来的帖子。 LINQ 将是我的下一步,但如果我不需要它,那就更好了!
    【解决方案2】:

    将四个数组放入数组数组中,并以i%4为索引。假设thread###Work数组有足够的空间来存储数据,你可以这样做:

    var tw = new[] {threadOneWork, threadTwoWork, threadThreeWork, threadFourWork};
    var i = 0;
    foreach (ReviewStatus data in routingData) {
        tw[i%4][i/tw.Length] = data;
        i++;
    }
    

    【讨论】:

    • 我们是否正确假设您的意思是多维数组 [,] 而不是锯齿状数组 [][]
    • @codesparkle 我写了“数组数组”而不是“多维数组”来区分。我只是添加了一个代码示例来澄清一下。
    【解决方案3】:

    Linq 是你的朋友!在您的案例 4 中,使用模数通过数组的总数对项目进行分组。

    例如,代码将它们分成四个不同的列表:

    var Items = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    
    Items.Select( ( i, index ) => new {
                                          category = index % 4,
                                          value = i
                                      } )
            .GroupBy( itm => itm.category, itm => itm.value )
            .ToList()
            .ForEach( gr => Console.WriteLine("Group {0} : {1}", gr.Key, string.Join(",", gr)));
    /* output
    Group 0 : 1,5,9
    Group 1 : 2,6,10
    Group 2 : 3,7
    Group 3 : 4,8
    */
    

    【讨论】:

    • 注意事项,不必提前创建数组。 foreach 可用于执行您寻求的处理。更紧凑的恕我直言;但很高兴你欣赏它。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多