生成字符串列表的所有组合

2024-04-06

我想生成一个字符串列表的所有可能组合的列表(它实际上是一个对象列表,但为了简单起见,我们将使用字符串)。我需要这个列表,以便我可以在单元测试中测试每种可能的组合。

例如,如果我有一个列表:

  var allValues = new List<string>() { "A1", "A2", "A3", "B1", "B2", "C1" }

我需要一个List<List<string>>所有组合如:

  A1
  A2
  A3
  B1
  B2
  C1
  A1 A2
  A1 A2 A3
  A1 A2 A3 B1
  A1 A2 A3 B1 B2
  A1 A2 A3 B1 B2 C1
  A1 A3
  A1 A3 B1
  etc...

递归函数可能是获得所有组合的方法,但这似乎比我想象的要难。

有什么指点吗?

谢谢。

编辑:两种解决方案,有或没有递归:

public class CombinationGenerator<T>
{
    public IEnumerable<List<T>> ProduceWithRecursion(List<T> allValues) 
    {
        for (var i = 0; i < (1 << allValues.Count); i++)
        {
            yield return ConstructSetFromBits(i).Select(n => allValues[n]).ToList();
        }
    }

    private IEnumerable<int> ConstructSetFromBits(int i)
    {
        var n = 0;
        for (; i != 0; i /= 2)
        {
            if ((i & 1) != 0) yield return n;
            n++;
        }
    }

    public List<List<T>> ProduceWithoutRecursion(List<T> allValues)
    {
        var collection = new List<List<T>>();
        for (int counter = 0; counter < (1 << allValues.Count); ++counter)
        {
            List<T> combination = new List<T>();
            for (int i = 0; i < allValues.Count; ++i)
            {
                if ((counter & (1 << i)) == 0)
                    combination.Add(allValues[i]);
            }

            // do something with combination
            collection.Add(combination);
        }
        return collection;
    }
}

您可以手动输入,利用 n 位二进制数自然对应于 n 元素集的子集这一事实。

private IEnumerable<int> constructSetFromBits(int i)
{
    for (int n = 0; i != 0; i /= 2, n++)
    {
        if ((i & 1) != 0)
            yield return n;
    }
}

List<string> allValues = new List<string>()
        { "A1", "A2", "A3", "B1", "B2", "C1" };

private IEnumerable<List<string>> produceEnumeration()
{
    for (int i = 0; i < (1 << allValues.Count); i++)
    {
        yield return
            constructSetFromBits(i).Select(n => allValues[n]).ToList();
    }
}

public List<List<string>> produceList()
{
    return produceEnumeration().ToList();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成字符串列表的所有组合 的相关文章

随机推荐

  • Three.js - 如何更新 arrowHelper?

    我正在尝试更新 arrowHelper 我尝试过操作箭头对象线中的顶点 设置所有内容dynamic true等等 但我似乎能做到的唯一方法就是删除旧线并绘制新线 有没有办法更新 arrowHelper 因此 您无法通过更改用于创建对象的值来
  • 如何将一个数组拆分为两个分别具有奇数和偶数索引的数组? [复制]

    这个问题在这里已经有答案了 如何将一个数组拆分为两个分别具有奇数和偶数索引的数组 例如 int a new int 1 3 7 8 然后得到两个数组 a1 1 7 a2 3 8 简单地使用重载Where http Where 3CTSour
  • 如何将unix时间戳转换为日期时间

    我正在尝试转换这个unix时间戳1415115303410在日期时间中 这样 private static DateTime UnixTimeStampToDateTime long unixTimeStamp System DateTim
  • 无法在詹金斯奴隶上运行 gradle

    我已经配置了一个 jenkins ubuntu 从机 我想在它上面运行我的 gradle 构建 使用 gradle 插件 问题是 当运行 jenkins 构建作业时 我得到 gradle no daemon info clean build
  • 如何在 VB.NET 中覆盖文本

    我曾经被教导如何使用以下代码附加文本文件 但是每次按下按钮一时如何覆盖该文件 没有人教我 Private Sub Button1 Click ByVal sender As System Object ByVal e As System E
  • 保存和恢复片段状态

    我有一系列的片段 我使用 上一个 和 下一个 按钮在该片段中进行导航 该片段中有许多编辑文本和单选按钮 当通过单击 上一个 按钮加载上一个片段时 我想保存和恢复这些编辑文本和单选按钮中的用户输入 截图 片段1 https i stack i
  • 用 Java 8 Streams 替换传统的 newForLoop

    因此 最终从 Java 6 到 Java 8 有了相对较大的跳跃 我阅读了大量的 Java 8 Streams API 不幸的是 几乎所有被问到的例子都几乎接近我试图弄清楚如何做的事情 但还不够接近 我拥有的是 final List
  • TextView textColor 中的数据绑定选择器

    我正在尝试根据频道中未读消息的数量从文本视图设置颜色 就像这样 android textColor channel unreadCount gt 0 color selector conversation row title unread
  • MediaEncodingProfile.CreateWmv 给出“未找到合适的转换来编码或解码内容。”错误

    我正在创建一个 Windows Phone 应用程序 XAML C 用于将音频和视频上传到服务器 在 Windows Phone 8 0 上使用 VideoCaptureDevice 效果很好 但它只允许设备支持的分辨率 在诺基亚 625
  • 使用 py2exe 隐藏 Python GUI 应用程序的控制台窗口

    我有一个使用 Qt 实际上是 PyQt4 的 Python 程序 当我从 main py 启动它时 我会得到一个控制台窗口和 GUI 窗口 当然 在 Windows 上 然后我用 py2exe 编译我的程序并成功创建 main exe 但是
  • 如何获得批号的可用数量

    如何获取多个仓库中批号的可用数量 假设我有3个仓库A B和C 批号 LOT0001 我想要所有三个位置的 LOT 0001 目前可用的总数量 在 odoo 中 您可以在上下文中传递过滤器 ex context lot id owner id
  • 导入错误:您必须是 root

    我尝试在 python 3 中使用键盘库 但仍然出现导入错误 我在 Thonny 的 Windows 中运行了该程序 它工作正常 但我无法在 pi 中运行它 我尝试以 root 身份运行它并使用 sudo 命令运行它 得到相同的结果 下面是
  • nhibernate 交替批量大小

    当使用 NHibernate 执行查询时 如果批处理大小设置为大于实际返回的结果 则似乎不考虑批处理大小 我正在使用最新版本的 NHibernate 2 1 0 4000 和 Linq to NHibernate 的 GA 我有一个类似于
  • 为什么在使用 Microsoft.Bcl - 无法等待'System.Threading.Tasks.Task 时,我不能在 Windows Phone 7.1 MvvmCross 项目中使用 wait 关键字?

    使用 Microsoft Bcl Microsoft BCL Portability Pack 时 我无法在 MvvmCross Windows Phone 7 1 项目中使用 wait 关键字 我已经发布了下面描述的示例项目的代码GitH
  • 只有创建视图层次结构的原始线程才能触摸其视图错误

    一切正常 除非到达代码的最后部分 注册成功 然后标题中提到的错误出现在registerDialog消息部分中 我做错了什么吗 谁能帮我检查我的代码 非常感谢 该应用程序没有崩溃 尽管它只是退出回到应用程序主页 如果我再次按下注册按钮 它将返
  • 如何根据周对 pandas 数据框进行分区并保存为 CSV?

    我有一个熊猫数据框 如下所示 这个数据框大约一个月的时间段 如何根据周对该数据框进行分区 我需要每 4 周保存为 4 个单独的 CSV 文件 Time Stamp Id Latitude Longitude 01 10 2016 15 22
  • 使用 AngularJS ngTable 自定义过滤器

    我正在尝试使用 ngTable 构建一个表 但使用与中描述的不同的自定义过滤ngTable 页面的示例 http bazalt cms com ng table example 11 我希望进行适当的过滤 但我不希望 ngTable 呈现过
  • Cypress:在第一次失败时中断所有测试

    如何在第一次测试失败时中断所有赛普拉斯测试 我们使用信号量为每个 PR 与 Cypress 启动完整的 e2e 测试 但这需要太多时间 我想在第一次测试失败时中断所有测试 获取完整的错误是每个开发人员在开发时的职责 如果在部署之前出现任何问
  • 如何使用grep提取子字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 从字符串中提取正则表达式结果并将其写入变量 https stackoverflow com questions 3148558 extract regexp result from string an
  • 生成字符串列表的所有组合

    我想生成一个字符串列表的所有可能组合的列表 它实际上是一个对象列表 但为了简单起见 我们将使用字符串 我需要这个列表 以便我可以在单元测试中测试每种可能的组合 例如 如果我有一个列表 var allValues new List