我经常使用两个相关集合,并希望访问foreach循环中的相应元素。
但是,没有" .Index"属性,有没有直接的方法这样做,没有增加一个计数器?
public void PrepareData()
{
var lines = ReadAllLines(@"\\tsclient\T\Bbtra\wapData.txt");
var headers = lines[0].Split(',');
var values = lines.Last().Split(',');
foreach(var value in values.Skip(1))
{
string message = "Data: "+headers[value.Index]+' '+value
}
}
答案 0 :(得分:2)
您可以使用Enumerable.Zip和匿名类型:
string[] names={"Rod", "Jane", "Freddy"}
int[] ages={28,32,26;};
var pairs=names.Zip(ages, (name,age) => new{Name=name, Age=age});
foreach(var pair in pairs)
{
string name=pair.Name;
string age=pair.Age;
}
答案 1 :(得分:1)
另一个变体是,使用{/ 3>等索引进行Select重载
public void PrepareData()
{
var lines = ReadAllLines(@"\\tsclient\T\Bbtra\wapData.txt");
var headers = lines[0].Split(',');
var values = lines.Last().Split(',').Select((el,index)=>new {value=el, index=index});
foreach(var value in values.Skip(1))
{
string message = "Data: "+headers[value.index]+' '+value.value
}
}
取决于标题和值中的数据,更好的变体可以是
public void PrepareData()
{
var lines = ReadAllLines(@"\\tsclient\T\Bbtra\wapData.txt");
var headers = lines[0].Split(',');
var values = lines.Last().Split(',');
foreach(var item in values.Skip(1).Select((el,index)=>new {value=el, index=index}))
{
string message = "Data: "+headers[item.index]+' '+item.value
}
}
答案 2 :(得分:0)
我想你想要一个.Zip
。
var pairs = headers.Zip(values,
(header, value) => new Tuple<string, string>(header, value));
答案 3 :(得分:-3)
使用IndexOf
执行此操作var lines = ReadAllLines(@"\\tsclient\T\Bbtra\wapData.txt");
var headers = lines[0].Split(',');
var values = lines.Last().Split(',');
foreach(var value in values.Skip(1))
{
string message = "Data: " + headers[Array.IndexOf(values, value)] + ' ' + value;
}
或者可能使用迭代器:
var lines = System.IO.File.ReadAllLines(@"\\tsclient\T\Bbtra\wapData.txt");
var headers = lines[0].Split(',');
var values = lines.Last().Split(',');
var e1 = headers.GetEnumerator();
var e2 = values.GetEnumerator();
while(e1.MoveNext() && e2.MoveNext())
{
string message = "Data: " + e1.Current.ToString() + ' ' + e2.Current.ToString();
}