1

List<string>ソースから特定の長さまでの単語のすべての組み合わせのリストを生成するにはどうすればよいですか?

たとえば、 にList<string>変換する必要がある 10,600 以上の単語がありますがList<List<string>>、サブ リストには、指定された最大長までの組み合わせのみを含める必要があります。この例では、3 とします。

サブリストに単語が表示される順序は気にしません。たとえば、リストには次の 1 つだけが必要です。

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

生成する必要がある多数の組み合わせを考えると、それは可能ですか?

どんな助けでも大歓迎です。

4

4 に答える 4

6

まず第一に、あなたが本当にそのような巨大なリストを生成したいのかわからない. 本当にそうするなら、この巨大なリストの代わりに遅延リスト生成にイテレータを使用することを検討することをお勧めします:

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;
        }
    }
}
于 2012-07-13T16:43:30.227 に答える
0

うまくいけば、私は何も台無しにしませんでした。

for(int i = 0; i < list.Count; i ++)
{
  list1 = new List<string> { list[i] };
  listcombinations.Add(list1);
  for(int j = i + 1; j < list.Count; j ++)
  {
    list1 = new List<string> { list[i], list[j] };
    listcombinations.Add(list1);
    for(int k = j + 1; k < list.Count; k ++)
    {
      list1 = new List<string> { list[i], list[j], list[k] };
      listcombinations.Add(list1);
    }
  }
}
于 2012-07-13T16:26:29.553 に答える
0

問題は主に、単語の組み合わせがリストに既に存在するかどうかを確認することだと思います。

そのためにできること:

//generate a dictionary with key hashcode / value list of string
Dictionary<int, List<string>> validCombinations= new Dictionary<int, List<string>>();

//generating anyway your combinations (looping through the words)
List<string> combinationToCheck = new List<string>(){"reviews", "laptop", "computer"};

//sort the words
combinationToCheck.Sort();
string combined = String.Join("", combinationToCheck.ToArray());

//calculate a hash
int hashCode = combined.GetHashCode();

//add the combination if the same hash doesnt exist yet
if(!validCombinations.ContainsKey(hashCode))
    validCombinations.Add(hashCode, combinationToCheck);
于 2012-07-13T16:34:47.877 に答える
0
private List<List<string>> GetCombinations()
{

    List<List<string>> mResult= new List<List<string>>();

    for (int i = 0; i < mList.Count; i++)
    {
        for (int k = 0; k < mList.Count; k++)
        {
            if (i == k) continue;

            List<string> tmpList = new List<string>();

            tmpList.Add(mList[i]);
            int mCount = 1;
            int j = k;
            while (true)
            {

                if (j >= mList.Count) j = 0;
                if (i != j)
                {

                    tmpList.Add(mList[j]);
                    mCount++;
                }
                j += 1;
                if (mCount >= mList.Count) break;
            }

            mResult.Add(tmpList);
        }

    }
    return mResult;
}
于 2014-02-06T13:04:02.273 に答える