c# - 从 List<string> of words 生成最多 X 长度的所有组合

标签 c# asp.net .net

我将如何从 List<string> 中生成一个包含所有单词组合的列表,直到一定长度?来源?

例如,我有一个 List<string>我需要将 10,600 多个单词转换为 List<List<string>> ,但是,子列表只需要包含最多并包括给定最大长度的组合,对于这个例子,我会说 3。

我不关心单词在子列表中出现的顺序。例如,我只需要列表中的以下一项:

"laptop", "computer", "reviews" 
"laptop", "reviews", "computer"
"computer", "laptop", "reviews" 
"computer" "reviews", "laptop"
"reviews", "computer", "laptop" 
"reviews", "laptop", "computer"

考虑到我需要生成大量组合,这是否可能?

非常感谢任何帮助。

最佳答案

首先,我不确定您是否真的想要生成这么大的列表。如果你真的这样做,那么我建议你考虑使用iterators对于惰性列表生成而不是这个巨大的列表:

static void Main()
{
    var words = new List<string> {"w1", "w2", "w3", "w4", "w5", "w6", "w7"};

    foreach (var list in Generate(words, 3))
    {
        Console.WriteLine(string.Join(", ", list));
    }
}

static IEnumerable<List<string>> Generate(List<string> words, int length, int ix = 0, int[] indexes = null)
{
    indexes = indexes ?? Enumerable.Range(0, length).ToArray();

    if (ix > 0)
        yield return indexes.Take(ix).Select(x => words[x]).ToList();

    if (ix > length)
        yield break;

    if (ix == length)
    {
        yield return indexes.Select(x => words[x]).ToList();
    }
    else
    {
        for (int jx = ix > 0 ? indexes[ix-1]+1 : 0; jx < words.Count; jx++)
        {
            indexes[ix] = jx;
            foreach (var list in Generate(words, length, ix + 1, indexes))
                yield return list;
        }
    }
}

关于c# - 从 List<string> of words 生成最多 X 长度的所有组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11474377/

相关文章:

c# - (object) 是一个 'field' 但像 'type' 一样使用

asp.net - 如何通过 Twitter API 通过单笔交易删除多条推文?

.net - 如何告诉 Roslyn C# 编译器使用特定版本的 .NET?

c# - 合并列表中实体的两个属性并使用 Linq 将其展平

c# - 尝试将 xml 数组反序列化为具有子类的 C# 类

c# - CallerMemberNameAttribute是否使用反射

c# - 如何从下拉列表中的数据源表访问其他列?

HiddenInput 的 Asp.Net MVC ModedMetadata 问题

.net - EF 和 Linq2Sql 中的 DataContext 可以存活多久?

c# - 无法在我的解决方案中添加来自新项目的新引用