-1

文字列値が分割されたリストを可能な値セットに変換するモジュールを実装する必要があります。

例えば

リストに次の値が含まれていることを考慮してください

1
1,2
3
4
5

モジュールは、上記のリストを可能な値セットのリストに変換する必要があります

1,2,3,4,5
1,1,3,4,5

前もって感謝します

4

2 に答える 2

2

これはそれを行いますが、あなたの例を逆の順序で返します:

static IEnumerable<string> Permutations(
    IEnumerable<string> input,
    char separator)
{
    var sepAsString = separator.ToString();

    var enumerators = input
       .Select(s => s.Split(separator).GetEnumerator())
        .ToArray();
    if (!enumerators.All(e => e.MoveNext())) yield break;

    while (true)
    {
        yield return String.Join(sepAsString, enumerators.Select(e => e.Current));
        if (enumerators.Reverse().All(e => {
                bool finished = !e.MoveNext();
                if (finished)
                {
                    e.Reset();
                    e.MoveNext();
                }
                return finished;
            }))
            yield break;
    }
}

使用法:

var list = new[] { "1", "1,2", "3", "4", "5" }.ToList();
var perms = Permutations(list, ',').ToList();
于 2013-02-25T15:49:58.320 に答える
1

ローリングの答えはかなりしっかりしていますが、読みやすく理解しやすいとは思いません。別の方法として、Linqの使用量を減らします。

    private List<string> Process(IEnumerable<string> input)
    {
        List<string> data = new List<string>();
        int preExpandCount = 0, offset = 0;
        foreach (string inputItem in input)
        {
            List<string> splitItems = inputItem.Split(',').ToList();
            if (data.Count > 0)
                preExpandCount = ExpandList(data, splitItems.Count - 1);

            offset = 0;
            foreach (string splitItem in splitItems)
            {
                if (preExpandCount == 0)
                    data.Add(splitItem);
                else
                {
                    for (int i = 0; i < preExpandCount; i++)
                        data[i + offset] = String.Format("{0},{1}", data[i + offset], splitItem);
                    offset += preExpandCount;
                }
            }
        }

        return data.OrderBy(e => e).ToList();
    }

    private int ExpandList(List<string> existing, int count)
    {
        int existingCount = existing.Count;
        for (int i = 0; i < count; i++)
            existing.AddRange(existing.Take(existingCount).ToList());
        return existingCount;
    }
于 2013-02-25T17:09:56.347 に答える