[英]Complex for loop c# - Iterating each column row to create “Configurations”
我一直在嘗試為該數據執行循環的最佳途徑。 我有一個可以在下面看到的表,需要遍歷所有列配置。 列數是動態的。 結果應為:
蘋果花椰菜冰淇淋
蘋果花椰菜派
蘋果胡蘿卜冰激凌
蘋果胡蘿卜派
蘋果豌豆冰激凌
蘋果豌豆派
蘋果綠豆冰淇淋
蘋果綠豆派
橙色西蘭花冰激凌
橙花椰菜派
橙胡蘿卜冰激淋
橙色胡蘿卜派
橙豆冰奶油
橙豌豆餅
橙綠色豆類冰淇淋
橙綠豆餅
我的“手動”代碼在下面,但我希望它在列方面更具動態性(可能有2、3、5等)
當列變化時進行動態循環的最佳方法是什么?
注意:我有一個對象“配置”和一個名為“ configs”的對象的列表
配置表圖片
List<Configuration> configs = new List<Configuration>();
// iterate left to right
for (int i1 = 0; i1 < dataGridConfigTable.Rows.Count - 1; i1++)
{
string param1 = dataGridConfigTable.Rows[i1].Cells[0].Value.ToString() ?? string.Empty;
if (!string.IsNullOrEmpty(param1))
{
for (int i2 = 0; i2 < dataGridConfigTable.Rows.Count - 1; i2++)
{
string param2 = dataGridConfigTable.Rows[i2].Cells[1].Value.ToString() ?? string.Empty;
if (!string.IsNullOrEmpty(param2))
{
for (int i3 = 0; i3 < dataGridConfigTable.Rows.Count - 1; i3++)
{
string param3 = dataGridConfigTable.Rows[i3].Cells[2].Value.ToString() ?? string.Empty;
if (!string.IsNullOrEmpty(param3))
{
for (int i4 = 0; i4 < dataGridConfigTable.Rows.Count - 1; i4++)
{
string param4 = dataGridConfigTable.Rows[i4].Cells[3].Value.ToString() ?? string.Empty;
if (!string.IsNullOrEmpty(param4))
{
for (int i5 = 0; i5 < dataGridConfigTable.Rows.Count - 1; i5++)
{
string param5 = dataGridConfigTable.Rows[i5].Cells[4].Value.ToString() ?? string.Empty;
if (!string.IsNullOrEmpty(param5))
{
configs.Add(new Configuration(param1, param2, param3, param4, param5));
}
}
}
}
}
}
}
}
}
}
您正在尋找笛卡爾積來產生最終輸出。
因此,首先將表(或您擁有的數據源)轉換為字符串列表列表,然后將笛卡爾乘積應用於集合中的每個列表。
//this function produce the cartesian product of two lists
List<string> CartesianProduct(List<string> lst1, List<string> lst2, string seperator)
{
var res = new List<string>();
for (int i = 0; i < lst1.Count; i++)
{
for (int j = 0; j < lst2.Count; j++)
{
res.Add(lst1[i] + seperator + lst2[j]);
}
}
return res;
}
//This function apply the cartesian product to all lists
List<string> CartesianProduct(List<List<string>> lsts, string seperator)
{
List<string> res = lsts[0];
for (int i = 1; i < lsts.Count; i++)
{
res = CartesianProduct(res, lsts[i], seperator);
}
return res;
}
您可以使用此方法將表轉換為列表
var dt1 = new DataTable(); //your data source
var lsts = new List<List<string>>();
for (int i = 0; i < dt1.Columns.Count; i++)
{
var singleColumnLst = new List<string>();
for (int j = 0; j < dt1.Rows.Count; j++)
{
singleColumnLst.Add((string)dt1.Rows[i][j]);
}
lsts.Add(singleColumnLst);
}
//final results
var allItems = CartesianProduct(lsts, "-");
編輯:好的,抱歉,錯過了動態的東西。 干得好。 EDIT1:不知道為什么這個例子會被否決。 對我來說很好。 在這里,我們更新使算法與數據表一起使用。
static void Main(string[] args)
{
System.Data.DataTable dataGridConfigTable = new System.Data.DataTable();
dataGridConfigTable.Columns.Add("Parameter1");
dataGridConfigTable.Columns.Add("Parameter2");
dataGridConfigTable.Columns.Add("Parameter3");
var row = dataGridConfigTable.NewRow();
row[0] = "Apple";
row[1] = "Broccoli";
row[2] = "Ice Cream";
dataGridConfigTable.Rows.Add(row);
row = dataGridConfigTable.NewRow();
row[0] = "Orange";
row[1] = "Carrots";
row[2] = "Pie";
dataGridConfigTable.Rows.Add(row);
row = dataGridConfigTable.NewRow();
row[1] = "Peas";
dataGridConfigTable.Rows.Add(row);
row = dataGridConfigTable.NewRow();
row[1] = "Grean Beans";
dataGridConfigTable.Rows.Add(row);
var dynamicList = new List<List<string>>();
foreach (System.Data.DataColumn dc in dataGridConfigTable.Columns)
{
dynamicList.Add(dataGridConfigTable.AsEnumerable().Select(s => s.Field<string>(dc.ColumnName)).Where(x => x != null).ToList());
}
List<string> result = null;
dynamicList.ForEach(x => BuildString(ref result, x));
result.ForEach(i => Console.WriteLine(i));
Console.ReadLine();
}
static void BuildString(ref List<string> param1List, List<string> param2List)
{
if (param1List == null)
{
param1List = param2List;
return;
}
List<string> result = new List<string>();
param1List.ForEach(x => param2List.ForEach(y => result.Add(String.Format("{0} - {1}", x, y))));
param1List = result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.