如何从姐妹系列中获得数字元素



我经常使用两个相关的集合,并希望访问foreach循环中的相应元素。

但是,没有".Index"属性,有没有直接的方法可以做到这一点,而不增加计数器?

     public void PrepareData()
        {
            var lines = ReadAllLines(@"\tsclientTBbtrawapData.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
            }
       }

您可以使用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;
}

还有一个变体,使用具有等索引的Select重载

public void PrepareData()
{
    var lines = ReadAllLines(@"\tsclientTBbtrawapData.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(@"\tsclientTBbtrawapData.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
    }
}

我想你想要一个.Zip

var pairs = headers.Zip(values, 
   (header, value) => new Tuple<string, string>(header, value));

使用IndexOf

var lines = ReadAllLines(@"\tsclientTBbtrawapData.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(@"\tsclientTBbtrawapData.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();
}

最新更新