我有一个数据表,需要使用函数中的数据填充。
此数据表有4列
DataTable table = new DataTable("DataTable");
table.Add("Header1", typeof(string));
table.Add("Header2", typeof(string));
table.Add("Header3", typeof(string));
table.Add("Header4", typeof(string));
此函数返回4个字符串列表
(List<string> list1,
List<string> list2,
List<string> list3,
List<string> list4) = await class.function();
我需要遍历这4个列表并将数据从这些列表中添加到数据表中,如此
table.Rows.Add(value1, value2, value3, value4);
问题是我一次只能循环浏览一个列表
foreach (string value in list1)
{
table.Rows.Add(value);
}
如何同时遍历所有4个列表并将数据添加到数据表?
答案 0 :(得分:1)
如果您的所有列表都具有相同的Count,则可以使用每个List<string>
实例的indexer。
for(int i=0; i < list1.Count; i++)
{
table.Rows.Add(list1[i], list2[i], list3[i], list4[i]);
}
但如果列表的计数不同,这将会中断。
如果您的列表具有不同的计数但是您希望将表填充到任何列表中的最后一个可用字段,那么您可以愉快地过度设计一个类来执行此操作。
以下类在其构造函数中接受任意数量的列表,然后让您遍历所有已用完的列表。基本上这个类在每个列表枚举器上调用MoveNext,直到它返回false。当它实现一个枚举器本身时,它返回一个对象[],可以进入一个DataTable.Rows.Add。
// enumerate any number of lists and return an object[] for each index
public class MultiListIterator: IEnumerator<object[]>, IEnumerable<object[]>, IEnumerable
{
readonly List<IEnumerator> lists = new List<IEnumerator>();
public MultiListIterator(params IEnumerable[] lst)
{
Array.ForEach(lst , (item) => lists.Add(item.GetEnumerator()));
}
IEnumerator IEnumerable.GetEnumerator()
{
return this;
}
// generic enumerator
public IEnumerator<object[]> GetEnumerator()
{
return this;
}
public bool MoveNext()
{
bool any = false;
// keep track of which are completed
var completed = new List<IEnumerator>();
foreach(var list in lists)
{
if (list != null)
{
var move = list.MoveNext();
any = any || move;
if (!move) completed.Add(list);
}
}
// nullify the completed iterators
foreach(var nullitem in completed)
{
lists[lists.IndexOf(nullitem)] = null;
}
return any;
}
object IEnumerator.Current
{
get
{
return Current;
}
}
// generic Enumerator
public object[] Current
{
get
{
object[] result = new object[lists.Count];
for(int i=0; i<lists.Count; i++)
{
if (lists[i] != null)
{
result[i] = lists[i].Current;
}
}
return result;
}
}
public void Reset()
{
}
public void Dispose()
{
}
}
以下是如何将该类与4个列表一起使用,但如果需要,可以使用任意数量的列表。
foreach(var row in new MultiListIterator(list1, list2, list3, list4))
{
// row returns an object[]
dt.Rows.Add(row);
}
以下是一个包含4个列表的示例输出,以及这些列表之间的不等数: