Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将带有拆分字符串的列表转换为可能的值集?_C#_List - Fatal编程技术网

C# 如何将带有拆分字符串的列表转换为可能的值集?

C# 如何将带有拆分字符串的列表转换为可能的值集?,c#,list,C#,List,我需要实现一个模块,它将一个包含拆分字符串值的列表转换为一个可能的值集 比如说 假设该列表包含以下值 1 1,2 3 4 5 模块应将上述列表转换为可能的值集列表 1,2,3,4,5 1,1,3,4,5 提前感谢这样就可以了,尽管它会以相反的顺序返回您的示例: static IEnumerable<string> Permutations( IEnumerable<string> input, char separator) { var sep

我需要实现一个模块,它将一个包含拆分字符串值的列表转换为一个可能的值集

比如说

假设该列表包含以下值

1
1,2
3
4
5
模块应将上述列表转换为可能的值集列表

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

提前感谢

这样就可以了,尽管它会以相反的顺序返回您的示例:

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;
    }
}

罗琳的答案相当可靠,但我觉得它不容易阅读和理解。还有一种方法,使用更少的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;
    }
私有列表进程(IEnumerable输入)
{
列表数据=新列表();
int preExpandCount=0,offset=0;
foreach(输入中的字符串inputItem)
{
List splitItems=inputItem.Split(',').ToList();
如果(data.Count>0)
preExpandCount=ExpandList(数据,splitItems.Count-1);
偏移量=0;
foreach(splitItems中的字符串splitItem)
{
如果(preExpandCount==0)
数据。添加(拆分项);
其他的
{
对于(int i=0;ie.ToList();
}
私有整数扩展列表(现有列表,整数计数)
{
int existingCount=existing.Count;
for(int i=0;i
    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;
    }