2016-09-20 8 views
0

私はコンビネーションの問題を抱えています。私は何をしようとしている実行時にすべてを取得

public abstract class DataField : IDataField 
{   
    public string Name { get; set; }   
    public List<string> Values { get; set; }  
} 

List<DataField>オブジェクトのすべての可能な組み合わせを得ることです:私が得たもの は基本的にnameを保持Dataクラスとvaluesのリストです。どのような私がこれまで試したことはある:

// Get dataFields with values 
List<IDataField> propertyDataFields = mDataFields.Where(x => x.Values.Count > 0).ToList(); 

var props = GetPropertiesList(propertyDataFields, 0, propertyDataFields.Count - 1, new List<List<FieldProperties>>()); 

private static List<List<FieldProperties>> GetPropertiesList(List<IDataField> propertyDataFields, int listPosition, int position, List<List<FieldProperties>> fieldPropertiesList) 
{ 
    var fieldProperties = new List<FieldProperties>(); 

    foreach (var item in propertyDataFields[position].Values) 
    { 
     if (position == -1) 
     { 
      GetPropertiesList(propertyDataFields, listPosition + 1, propertyDataFields.Count - 1, fieldPropertiesList); 
     } 
     fieldProperties.Add(new FieldProperties(propertyDataFields[position].Name, item)); 

     GetProperties(propertyDataFields, position - 1, fieldProperties, fieldPropertiesList); 
    } 

    return fieldPropertiesList; 
} 

private static void GetProperties(List<IDataField> propertyDataFields, int position, List<FieldProperties> fieldProperties, List<List<FieldProperties>> fieldPropertiesList) 
{ 
    if (position == -1) 
    { 
     fieldPropertiesList.Add(fieldProperties); 
    } 
    foreach (var item in propertyDataFields[position].Values) 
    { 
     fieldProperties.Add(new FieldProperties(propertyDataFields[position].Name, item)); 
     GetProperties(propertyDataFields, position - 1, fieldProperties, fieldPropertiesList); 
    } 
} 

終わりに、私はFieldPropertiesオブジェクトのリストのリストを必要としています。考え方はリストの最後のdataFieldで始まり、毎回foreachを使用してループしますが、最初のリストにはたとえば1のエントリしかない場合は機能しません。たぶんソート:ValuesCountアイデアですか?

編集:FieldPropertiesは、別のdll imを使用しているクラスです。私はすべてのDataField.Valueのインスタンスを作成する必要があります。

szenarioは:List<IDataField>です。

私はList<List<FieldProperties>>を、すべての可能なDataFieldの組み合わせで作成したいと考えています。

+0

は、あなたが入力の例を追加できますし、それが出力に一致するのか? – Maarten

+0

'FieldProperties'とは何ですか?あなたの*実際の要件は何ですか?私は、いくつかの問題を正直に言うと、恐ろしい技術的解決策のように思えます。 – MarioDS

+0

それでは、7つの 'DataField'オブジェクトが必要です。 Valuesフィールドには、1,2,3、1,2、1,3、2,3、1、2、3がありますか?これは非常に奇妙なことを望んでいるように思えるので、私が正しく理解することを確認したい。また、私はMarioDSに、これは少し違った問題に対する悪い解決策のように思えるだろう。 – Chris

答えて

1

あなたはHow to iterate lists with different lengths to find all permutations?に私の答えから、一般的な方法を使用することができます簡単なLINQと組み合わせる

public static class Algorithms 
{ 
    public static IEnumerable<T[]> GenerateCombinations<T>(this IReadOnlyList<IReadOnlyList<T>> input) 
    { 
     var result = new T[input.Count]; 
     var indices = new int[input.Count]; 
     for (int pos = 0, index = 0; ;) 
     { 
      for (; pos < result.Length; pos++, index = 0) 
      { 
       indices[pos] = index; 
       result[pos] = input[pos][index]; 
      } 
      yield return result; 
      do 
      { 
       if (pos == 0) yield break; 
       index = indices[--pos] + 1; 
      } 
      while (index >= input[pos].Count); 
     } 
    } 
} 

var fields = mDataFields.Where(x => x.Values.Count > 0).ToList(); 
var result = fields 
    .Select(df => df.Values).ToList() 
    .GenerateCombinations() 
    .Select(c => c.Select((v, i) => new FieldProperties(fields[i].Name, v)).ToList()) 
    .ToList(); 
+0

ご協力ありがとうございます。私はあなたの解決策を理解しようとしていますが、私は正面からの声明なしにセミコロンを理解しません。あなたはGoogleに私に流行語を教えてもらえますか? – user3292642

+0

これは単に最初の部分(初期化子)が欠けている 'for'です。ここでは(for C#Reference)(https://msdn.microsoft.com/en-us/library/ch45axte.aspx)にあるように、すべてのfor文には3つのセクションがあります。 - for(initializer; condition;イテレーター) 'であり、いずれもオプションです。 –

関連する問題