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

これは、6つのグループを選択するという「ハードコーディングされた」事実を使用した、簡単で汚いソリューションです。一般的なソリューションの場合、再帰とすべての組み合わせの生成が必要です (アルゴリズムから開始して、 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 に答える