用于构建所有子集的功能

时间:2018-05-17 10:49:28

标签: c#

我想创建一个创建所有子集列表的函数。例如:

if list candid in step 1 is: {1,2,4,5}
output: {12,14,15,24,25,45}

and if list candid in step 2 is: {12,14,25,45} (15,24 deleted)
output: {124,125,145}

我在下面编写了代码,但此代码仅用于构建坦率的第2步。

            for (int i = 0; i < candid.Count; i++)
            {
                for (int j = i + 1; j < candid.Count; j++)
                {
                    if(ratecandid[i] > 50)
                    {
                        candid_new.Add(int.Parse(string.Concat(candid[i], candid[j])));
                    }
                }
            }

我认为这不是一个好的代码。您能否提供适合其他列表的适当解决方案?

已更新:

一般来说,我们有一组数字。 (1,2,4,5),在该集合的另一个函数中定义了一个速率(100,101,94,172)(94为4)。如果每个数字的速率小于50,则不选择该数字。所以首先,选择所有成员,我们必须创建所有可能的子集。 {} 12,14,15,24,25,45。同样,对于这些成员,确定了费率(60,74,42,36,74,63,)。如果每个数字(速率12为60)的速率小于50,则不选择该数字。所以这个集合被选中{12,14,25,45},现在,我们必须创建所有可能的子集。 {} 124125145。

该集合必须按顺序排列(如:字母顺序),并且不应存在定期成员。 121和122有经常性成员

2 个答案:

答案 0 :(得分:0)

由于您的费率计算仍然未知,因此这是一个可以获得所有可能结果的部分工具:

var result = new List<int> { };
for (int i = 0; i < candid.Count(); i++)
{
    for (int j = i + 1; j < candid.Count(); j++)
    {
        var value =
            int.Parse(
                new string(
                    string.Concat(candid[i], candid[j])
                        .OrderBy(x => x)
                        .Distinct()
                        .ToArray()
                    )
                );

        if (true)
        {
            result.Add(value);
        }
    }
}
return result.Distinct().ToArray();

新部分基本上是:

- int是连接的。
- 删除其中的重复数字 - 命令他们。

- 如果它满足您的条件,则将其添加到结果中。

- 在返回结果之前确保它没有重复。瞧。

答案 1 :(得分:0)

这里我向您展示了一个接受数字列表并使用该列表的方法,它将提供新的列表。

新列表将负责

  • 按字母顺序排列的数字
  • 没有重复的数字
  • 没有经常性的数字

你只需要检查你的费率的逻辑部分,以便那些费率低于50的数字

private static List<int> GetNewList(List<int> numberList)
{
    List<int> newNumList = new List<int>();
    for (int i = 0; i < numberList.Count - 1; i ++)
    {
        for(int j = i+1; j < numberList.Count; j++)
        {
            string number = "";
            foreach (char ch in numberList[j].ToString())
            {
                number = numberList[i].ToString() + ch;

                if (!IsNumRecurring(number))
                {
                    number = String.Concat(number.OrderBy(c => c));
                    int num = int.Parse(number);

                    if (!newNumList.Contains(num))
                        newNumList.Add(num);
                }
            }
        }
    }

    //Now we should check the same thing in reverse order on list.
    for (int i = numberList.Count - 1; i > 0; i--)
    {
        for (int j = i -1; j >= 0; j--)
        {
            string number = "";
            foreach (char ch in numberList[j].ToString())
            {
                number = numberList[i].ToString() + ch;

                if (!IsNumRecurring(number))
                {
                    number = String.Concat(number.OrderBy(c => c));
                    int num = int.Parse(number);

                    if (!newNumList.Contains(num))
                        newNumList.Add(num);
                }
            }
        }
    }
    return newNumList;
}

//here we will check if number is recurring
private static bool IsNumRecurring(string num)
{
    return num.Any(c => num.Where(ch => ch == c).Count() > 1);
}