【问题标题】:How to get ienumerated element from sister collection如何从姐妹集合中获取枚举元素
【发布时间】:2015-03-25 13:00:48
【问题描述】:

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

【问题讨论】:

    标签: c# collections


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      还有一个变体,使用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
          }
      }
      

      【讨论】:

      • Goddamit 被秒打败 :p +1 BTW
      • @BinaryWorrier,有趣的是,我认为,你的版本更正确:-)
      • 很遗憾索引没有作为标准提供。对我来说似乎很有用。
      • @Grundy:随意提升更好的部分并在你的答案中使用它们
      【解决方案3】:

      我想你想要一个.Zip

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我必须转换“ToLIst”,希望有更直接的方法
        • Array.IndexOf(values, value),不转换为List
        • @cdie Array.IndexOf(values, value) 是完美的!这不一定要有很好的性能,对我来说“可读性”很高——谢谢。很抱歉其他人不喜欢这个主意
        猜你喜欢
        • 1970-01-01
        • 2018-03-22
        • 2015-04-05
        • 2020-03-31
        • 1970-01-01
        • 2019-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多