如何从姐妹集合中获取枚举元素

How to get ienumerated element from sister collection

我经常使用两个相关的集合,想在一个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
            }
       }

我想你想要一个 .Zip

var pairs = headers.Zip(values, 
   (header, value) => new Tuple<string, string>(header, 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;
}

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

另一种变体,使用 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
    }
}

取决于 headers 中的数据和值,更好的变体可以是

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
    }
}