4

大家好,我正在做一点自学,我遇到的问题似乎暂时难住了我,我认为这里有人我确定过去已经遇到过类似的事情。我有一个 1-10 的数组列表

public List<int> ValueArrays = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

我试图得到每个 6 组的总和,但我只是卡住了。例如我想要

[1,2,3,4,5,6]
[1,3,4,5,6,7]
[1,4,5,6,7,8] etc...

我已经写了一些代码,但我只是在这里磕磕绊绊。

private void runbtn_Click(object sender, EventArgs e)
        {
            int thisTotal;
            //Object ListOfNumbersToCompareTo = new Object[];
            List<int> fiveEl = new List<int> { }; //= ValueArrays.GetRange(1, 5);//target a group of 5
            List<int> test2 = new List<int> { };
            //test2.AddRange(fiveEl);

            //thisTotal = SumRange(fiveEl);
             int groupSize = 5;





            for (int i = 0; i < ValueArrays.Count; i++)
            {

                fiveEl=ValueArrays.GetRange(i+1, 5);
                currentNum = ValueArrays[i];
                fiveEl.Add(currentNum);


                for (int x = 0; x < 1; x++)
                {
                    thisTotal = SumRange(fiveEl);

                    //fiveEl = ValueArrays.GetRange(x, groupSize);
                    //fiveEl.Add(currentNum);
                    //fiveEl.RemoveRange(x, groupSize); ;
                }




            }
}

有人可以给我一个代码片段或指出我正确的方向吗?提前致谢。

4

2 回答 2

1

这是一个带有“硬编码”事实的快速 n 肮脏解决方案,您可以选择六人一组。对于通用解决方案,您需要递归并生成所有组合(您可以从Algorithm 开始从 n 返回 k 元素的所有组合

var numbersList = new[] { 1, 2, 3, 4, 5, 6 ,7,8,9,10};

        var groupsBySix = from i1 in numbersList
                        from i2 in numbersList.Where( i => i>i1)
                        from i3 in numbersList.Where(i => i > i2)
                        from i4 in numbersList.Where(i => i > i3)
                        from i5 in numbersList.Where(i => i > i4)
                        from i6 in numbersList.Where(i => i > i5)
                        select new []{ i1, i2, i3, i4, i5, i6 };


        var cachedGroups = groupsBySix.ToList();  // 210 groups of int arrays. Starts with [1..6] and ends with [5..10]
        var sums = groupsBySix.Select(list => list.Sum());
于 2012-12-02T09:08:10.857 回答
0

我个人会这样写:

var values = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var groupsOfSix = values.Subsequences().Where(s => s.Count() == 6);

然后当然你可以.Sum()在每个生成的子序列上使用。

这使用了我前段时间写的一个扩展方法,它生成一个IEnumerable<T>. 这个解决方案不是最快的,但是天哪,它使代码易于阅读并且明显正确,并且在只有 10 个元素的输入列表中,它的速度已经足够快了。

这是Subsequences功能:

/// <summary>
/// Returns all subsequences of the input <see cref="IEnumerable&lt;T&gt;"/>.
/// </summary>
/// <param name="source">The sequence of items to generate subsequences of.</param>
/// <returns>A collection containing all subsequences of the input <see cref="IEnumerable&lt;T&gt;"/>.</returns>
public static IEnumerable<IEnumerable<T>> Subsequences<T>(this IEnumerable<T> source)
{
    if (source == null)
        throw new ArgumentNullException("source");
    // Ensure that the source IEnumerable is evaluated only once
    return subsequences(source.ToArray());
}

private static IEnumerable<IEnumerable<T>> subsequences<T>(IEnumerable<T> source)
{
    if (source.Any())
    {
        foreach (var comb in subsequences(source.Skip(1)))
        {
            yield return comb;
            yield return source.Take(1).Concat(comb);
        }
    }
    else
    {
        yield return Enumerable.Empty<T>();
    }
}
于 2012-12-02T09:25:46.457 回答