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

时间:2015-03-25 13:00:48

标签: c# collections

我经常使用两个相关集合,并希望访问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
            }
       }

4 个答案:

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