【问题标题】:Convert KeyValuePair<int,string> to an int[] array and string[] array将 KeyValuePair<int,string> 转换为 int[] 数组和 string[] 数组
【发布时间】:2013-01-18 20:01:44
【问题描述】:
KeyValuePair<int, string>[][] partitioned = SplitVals(tsRequests.ToArray());

不要太担心我使用的方法;假设我得到了一个锯齿状的 KeyValuePairs 数组,它们被平均分成不同的数组。

foreach (KeyValuePair<int, string>[] pair in partitioned)
{
    foreach (KeyValuePair<int, string> k in pair)
    {
    }
}

我需要知道如何有效地获取 int 数组中的整数,以及从键值对数组中获取单独字符串数组中的字符串。这样,两个索引在单独的数组中相互匹配。

比如我把它拆分成一个int[]数组和一个string[]数组后,

intarray[3] must match stringarray[3] just like it did in the keyvaluepair.

假设我有一个带有 KVP 的锯齿状数组,例如:

    [1][]<1,"dog">, <2,"cat">
    [2][]<3,"mouse">,<4,"horse">,<5,"goat">
    [3][]<6,"cow">

我需要在每次迭代中变成这个

    1. 1,2 / "dog","cat"
    2. 3,4,5 / "mouse", "horse", "goat"
    3. 6 / "cow"

【问题讨论】:

    标签: c# .net multidimensional-array jagged-arrays


    【解决方案1】:
    int[] keys = partitioned.Select(pairs => pairs.Select(pair => pair.Key).ToArray())
        .ToArray();
    string[] values = partitioned.Select(pairs => pairs.Select(pair => pair.Value).ToArray())
        .ToArray();
    

    【讨论】:

    • 所以我什至不需要把它放在循环中?
    • SelectManySelect 方法都会循环遍历内部提供给它们的序列,因此循环正在发生,您不需要自己编写它们。
    • 你用 KVP 做了我想要的,但不是我想要的整体。无论如何,第一个循环都需要发生,它只是我想避免的第二个循环。我基本上将我的 keyvalpair 数组拆分为更多数组,但我不想将它们全部放在 2 个大列表中。我想在每次循环时将每个部分放入列表中。
    • @Ramie 如果您不想要两个包含所有键和所有值的数组,那么不清楚您想要什么。请提供示例输入和输出以澄清。
    • @Ramie 所以你想要的是两个带有键和值的锯齿状数组;没有被压扁。这是一个微不足道的变化;你只需要使用Select 而不是SelectMany
    【解决方案2】:

    只是为了让您入门:

        var list = new List<KeyValuePair<int, int>>();
        var key = new int[list.Count];
        var values = new int[list.Count];
        for (int i=0; i < list.Count ;i++)
        {
            key[i] = list[i].Key;
            values[i] = list[i].Value;
        }
    

    【讨论】:

      【解决方案3】:
      List<int> keys = new List<int>();
      List<string> values = new List<string>();
      foreach (KeyValuePair<int, string>[] pair in partitioned)
      {
          foreach (KeyValuePair<int, string> k in pair)
          {
              keys.Add(k.Key);
              values.Add(k.Value);
          }
      }
      keyArray = keys.ToArray();
      valueArray = values.ToArray();
      

      【讨论】:

        【解决方案4】:
        public static void ToArrays<K,V>(this IEnumerable<KeyValuePair<K,V>> pairs, 
            out K[] keys, out V[] values)
        {
           var keyList = new List<K>();
           var valueList = new List<V>();
           foreach (KeyValuePair<K,V> pair in pairs)
           {
              keyList.Add(pair.Key);
              valueList.Add(pair.Value);
           }
           keys = keyList.ToArray();
           values = valueList.ToArray();
        }
        

        因为你有一个锯齿状数组,你还需要将它展平才能使用该函数:

        public static IEnumerable<T> flatten(this T[][] items)
        {
           foreach(T[] nested in items)
           {
              foreach(T item in nested)
              {
                 yield return item;
              }
           }
        }    
        

        像这样把它们放在一起:

         MyKeyValuePairCollection = GetKeyValuePairJaggedArray();
         int[] keys;
         string[] values;
         MyKeyValuePairCollection.flatten().ToArrays(out keys, out values);
        

        【讨论】:

        • 请注意,他有一个锯齿状的键值对数组。那不是IEnumerable&lt;KeyValuePair&lt;K,V&gt;&gt;。这是IEnumerable&lt;IEnumerable&gt;KeyValuePair&lt;K,V&gt;&gt;&gt;
        • 我还是会使用上面的函数,但是有额外的代码先把锯齿弄平;)
        • 我的意思是这就是你所缺少的。您应该添加相关函数以展平列表。
        • 诅咒:我回答的最后一个问题是一个复杂的 VB 问题,我使用的是“共享”而不是“静态”。现在也修复了这个问题
        • 你知道Flatten不需要是自定义方法,你可以使用SelectMany。这正是它的作用;展平一系列序列。
        猜你喜欢
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 2013-01-08
        • 1970-01-01
        • 2013-12-28
        • 2011-10-16
        相关资源
        最近更新 更多