我遇到了组合问题。我得到的是一个Data
基本上包含name
和的列表的类values
:
public abstract class DataField : IDataField
{
public string Name { get; set; }
public List<string> Values { get; set; }
}
在运行时,我试图做的就是获取List<DataField>
对象的所有可能组合。到目前为止,我尝试过的是:
// 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
条目,则此方法将无效。也许按排序Values
。Count
是个主意吗?
编辑:FieldProperties
是从另一个dll即时通讯使用的类。我需要为每个DataField.Value创建一个实例。
该SZENARIO是:我有一个List<IDataField>
如
var dataFieldAuthor = new DataField() {
Name = "Author"
Values = new List<string> { "Author1", "Author2", "Author3" };
}
我想List<List<FieldProperties>>
用DataField值的所有可能组合创建一个。
您可以从我的答案中使用泛型方法,该答案如何遍历具有不同长度的列表以查找所有排列?:
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);
}
}
}
结合简单的LINQ:
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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句