0

私は脳がフリーズしており、この問題の解決策を見つけることができません.

文字列リストを含む CustomSet というクラスを作成しました。CustomSet への参照を保持するクラスは、それをリストとして格納します。

public class CustomSet : IEnumerable<string>
{
    public string Name { get; set; }
    internal IList<string> elements;

    public CustomSet(string name)
    {
        this.Name = name;
        this.elements = new List<string>();
    }

    public IEnumerable<string> Elements
    {
        get
        {
            return elements;
        }
    }
    public IEnumerator<string> GetEnumerator()
    {
        return elements.GetEnumerator();
    }
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

したがって、このカスタム セットのリストを繰り返し処理して、列が customSet(s) の数であり、行が customSet 要素の乗算である 2D 文字列配列を出力します。

例として、リストに 3 つのカスタム セットがあるとします。1 番目には 3 つの要素があり、2 番目には 2 つの要素があり、3 番目には 3 つの要素がありました。3 列と 18 行 (3*2*3) を出力したいと思います。次のコードは、解決策の試みです。

CustomSet motion = new CustomSet("Motion");
motion.Elements.Add("low");
motion.Elements.Add("medium");
motion.Elements.Add("high");

CustomSet speed = new CustomSet("Speed");
speed.Elements.Add("slow");
speed.Elements.Add("Fast");

CustomSet mass = new CustomSet("Mass");
mass.Elements.Add("light");
mass.Elements.Add("medium");
mass.Elements.Add("heavy");

List<CustomSet> aSet = new List<CustomSet>();
aSet.Add(motion);
aSet.Add(speed);
aSet.Add(mass);

//problem code
int rows = 1;
for(int i = 0; i < aSet.Count; i++)
{
    rows *= aSet[i].Elements.Count;
}

string[,] array = new String[aSet.Count, rows];
int modulus;

for (int i = 0; i < aSet.Count; i++)
{
    for (int j = 0; j < rows; j++)
    {
        modulus = j % aSet[i].Elements.Count;
        array[i, j] = aSet[i].Elements[modulus];
    }
}

for (int j = 0; j < rows; j++)
{
    for (int i = 0; i < aSet.Count; i++)
    {
        Console.Write(array[i, j] + " / ");
    }
    Console.WriteLine();
}
//end

Console.ReadLine();

ただし、コードは正しい文字列配列を出力しません (近いですが)。私が出力したいのは次のとおりです。

低い / 遅い / 軽い /

低 / 遅 / 中 /

低い / 遅い / 重い /

低い / 速い / 軽い /

低 / 高速 / 中 /

低い / 速い / 重い /

ミディアム / スロー / ライト /

ミディアム / スロー / ミディアム /

ミディアム / スロー / ヘビー /

ミディアム / ファースト / ライト /

中 / 速い / 中 /

ミディアム / ファースト / ヘビー /

高い / 遅い / 軽い /

高 / 遅 / 中 /

高い / 遅い / 重い /

高い / 速い / 軽い /

高 / 高速 / 中 /

高い / 速い / 重い /

この問題の変数は、リスト内の customSet の数と、各 CustomSet 内の要素の数です。

4

2 に答える 2

7

あなたは一度に製品を手に入れることができます:

var crossJoin = from m in motion
                from s in speed
                from ms in mass
                select new { Motion = m, Speed = s, Mass = ms };

foreach (var val in crossJoin)
{
   Console.Write("{0} / {1} / {2}", val.Motion, val.Speed, val.Mass);
}

ここで、リストの数がわからないので、さらに行う必要があります。Eric Lippert は、この記事CertesianProductでこれについて説明しています。ここでは、そこで定義されている関数を次の方法で使用できます。

var cProduct = SomeContainerClass.CartesianProduct(aSet.Select(m => m.Elements));
var stringsToOutput = cProduct.Select(l => string.Join(" / ", l));
于 2013-08-08T16:12:42.723 に答える