gpt4 book ai didi

c# - 获取所有项目组合

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:17:14 25 4
gpt4 key购买 nike

我遇到了一个组合问题。我得到的是 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 创建一个实例。

情况是:我有一个 List<IDataField>例如

  var dataFieldAuthor = new DataField() {
Name = "Author"
Values = new List<string> { "Author1", "Author2", "Author3" };
}

我想创建一个 List<List<FieldProperties>>具有 DataField 值的所有可能组合。

最佳答案

您可以使用我对 How to iterate lists with different lengths to find all permutations? 的回答中的通用方法:

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();

关于c# - 获取所有项目组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39593130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com