【问题标题】:Merging two arrays in C# [duplicate]在C#中合并两个数组[重复]
【发布时间】:2019-01-29 16:42:47
【问题描述】:

在我的代码中,我有 2 个数组,我想使用正确的序列合并这两个数组。并将值保存到第三个数组。我尝试了很多,但找不到完美的解决方案。

public void Toolchange_T7()
{
    for (int T7 = 0; T7 < sModulename_listofsafetysensor.Length; T7++)
    {
        if (sModulename_listofsafetysensor[T7] != null && sModulename_listofsafetysensor[T7].Contains("IR") && sModulename_listofsafetysensor[T7].Contains("FS"))
        {
            sElement_toolchanger[iET7] = sModulename_listofsafetysensor[T7];
            iET7++;
        }

    }
    for (int T7 = 0; T7 < sDesignation_toolchanger_t7.Length; T7++)
    {
        if (sDesignation_toolchanger_t7[T7] != null && sDesignation_toolchanger_t7[T7].Contains("IR") && sDesignation_toolchanger_t7[T7].Contains("FW"))
        {
            sDesignation_toolchanger[iMT7] = sDesignation_toolchanger_t7[T7];
            iMT7++;
        }
    }
}

sElement_toolchanger 包含:

++ST010+IR001+FW001 
++ST010+IR002+FW001
++ST010+IR006+FW001 

sDesignation_toolchanger 包含:

++ST010+IR001.FS001
++ST010+IR001.FS002
++ST010+IR002.FS001
++ST010+IR002.FS002
++ST010+IR006.FS001
++ST010+IR006.FS002

我想要的输出是:

++ST010+IR001+FW001 
++ST010+IR001.FS001
++ST010+IR001.FS002
++ST010+IR002+FW001
++ST010+IR002.FS001
++ST010+IR002.FS002
++ST010+IR006+FW001 
++ST010+IR006.FS001
++ST010+IR006.FS002

如果有人知道完美的解决方案将非常有帮助

【问题讨论】:

  • 这个问题将受益于对当前问题的描述(尽管提供示例输入和输出的荣誉!)
  • 您能解释一下您的代码当前在做什么吗?你看过stackoverflow.com/questions/1547252/… 吗?看来您的集合只是字符串数组,可以轻松合并。
  • 我想将输出值按正确的顺序排列,稍后我会将这些数据填充到单词表中......mearging 2 数组不是大问题,但我希望以顺序形式输出。跨度>
  • 您的数据按您想要的顺序排序,所以只需 Sort 或 OrderBy。
  • 例如,正如我在输出值描述中所写,我想从第一个数组中获取一个值,然后转到第二个数组,然后从该数组中获取 2 个值(基于该数组中的可用数据)我再次转到第一个数组并获取该数组的第二个值,依此类推....

标签: c# arrays .net


【解决方案1】:
using System.Collections;

var mergedAndSorted = list1.Union(list2).OrderBy(o => o);

【讨论】:

  • 如果你想要List&lt;string&gt;而不是IEnumerable&lt;string&gt;,请在末尾添加.ToList()
  • 这会匹配所需的输出吗? “++ST010+IR001+FW001 后跟 ++ST010+IR001.FS001”。你的输出会一样吗?
  • 这个问题是它连接了两个已排序的输入数组,然后再次对它们进行排序。如果输入中有足够的条目,那么这可能是很多浪费的工作。 “单通”解决方案可能更合适
【解决方案2】:

最简单的方法是:

将数组转换为列表:

var List1 = new List<string>(myArray1);
var List2 = new List<string>(myArray2);

将两个列表合并在一起:

List1.AddRange(List2);

并对它们进行排序。

List1.Sort();

【讨论】:

    【解决方案3】:

    根据您在 cmets 中所说的,这是一个小函数,它将从第一个数组中获取一个项目,然后从第二个数组中获取两个项目,依此类推以生成第三个项目。

    此代码可以改进...

    static void Main(string[] args)
    {
        string[] t1 = new string[] { "a", "b", "c" };
        string[] t2 = new string[] { "a1", "a2", "b1", "b2", "c1", "c2" };
        List<string> merged = Merge(t1.ToList(), t2.ToList());
        foreach (string item in merged)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
    
    private static List<T> Merge<T>(List<T> first, List<T> second)
    {
        List<T> ret = new List<T>();
        for (int indexFirst = 0, indexSecond = 0; 
            indexFirst < first.Count && indexSecond < second.Count; 
            indexFirst++, indexSecond+= 2)
        {
            ret.Add(first[indexFirst]);
            ret.Add(second[indexSecond]);
            ret.Add(second[indexSecond + 1]);
        }
        return ret;
    }
    

    An example here

    【讨论】:

      【解决方案4】:

      从您给定的示例输出中,它看起来不是按字母顺序排序的。在这种情况下,您需要在加入 Union 后将自定义比较器与 OrderBy 条款一起使用。

      例如,(由于您的排序算法未知,我在这里假设一个用于显示示例)

      var first = new[]{"++ST010+IR001+FW001","++ST010+IR002+FW001","++ST010+IR006+FW001"};
      var second = new[]{"++ST010+IR001.FS001",
                                            "++ST010+IR001.FS002",
                                            "++ST010+IR002.FS001",
                                            "++ST010+IR002.FS002",
                                            "++ST010+IR006.FS001",
                                            "++ST010+IR006.FS002"};
      var customComparer = new CustomComparer();
      var result = first.Union(second).OrderBy(x=>x,customComparer);
      

      自定义比较器的定义位置

      public class CustomComparer : IComparer<string>
      {
          int IComparer<string>.Compare(string x, string y)
          {
              var items1 = x.ToCharArray();
              var items2 = y.ToCharArray();
              var temp = items1.Zip(items2,(a,b)=> new{Item1 = a, Item2=b});
              var difference = temp.FirstOrDefault(item=>item.Item1!=item.Item2);
      
              if(difference!=null)
              {
                  if(difference.Item1=='.' && difference.Item2=='+')
                      return 1;
                  if(difference.Item1=='+' && difference.Item2=='.')
                      return -1;
              }
              return string.Compare(x,y);
          }
      
          public int GetHashCode(string obj)
          {
              return obj.GetHashCode();
          }
      }
      

      输出

      【讨论】:

        【解决方案5】:

        如果两个输入数组已经排序,这是一个解决方案。由于我怀疑您的比较功能不简单,因此我包含了一个单独的比较功能(效率不是很高,但可以)。比较函数将字符串分成两部分(字母部分和数字部分),然后进行比较,使数字部分在排序中更“重要”。

        请注意,它不进行任何排序 - 它依赖于被排序的输入。它只是从两个数组之一中的当前位置选择较低值的项目,以传输到输出数组。结果是 O(N)。

        代码单次遍历两个数组(在一个循环中)。当我运行它时,输出是AA00, AA01, AB01, AB02, AC02, AA03, AA04。我确信有机会让这段代码更干净,我只是把它弹出来。但是,它应该会给您提供继续的想法:

        public class TwoArrays
        {
            private string[] _array1 = {"AA01", "AB01", "AB02", "AC02"};
            private string[] _array2 = {"AA00", "AA03", "AA04"};
        
            public void TryItOut()
            {
                var result = ConcatenateSorted(_array1, _array2);
                var concatenated = string.Join(", ", result);
            }
        
            private int Compare(string a, string b)
            {
                if (a == b)
                {
                    return 0;
                }
        
                string a1 = a.Substring(0, 2);
                string a2 = a.Substring(2, 2);
                string b1 = b.Substring(0, 2);
                string b2 = b.Substring(2, 2);
                return string.Compare(a2 + a1, b2 + b1);
            }
        
            private string[] ConcatenateSorted(string[] a, string[] b)
            {
                string[] ret = new string[a.Length + b.Length];
                int aIndex = 0, bIndex = 0, retIndex = 0;
                while (true)    //do this forever, until time to "break" and return
                {
                    if (aIndex >= a.Length && bIndex >= b.Length)
                    {
                        return ret;
                    }
        
                    if (aIndex >= a.Length)
                    {
                        ret[retIndex++] = b[bIndex++];
                        continue;
                    }
        
                    if (bIndex >= b.Length)
                    {
                        ret[retIndex++] = a[aIndex++];
                        continue;
                    }
        
                    if (Compare(a[aIndex], b[bIndex]) > 0)
                    {
                        ret[retIndex++] = b[bIndex++];
                    }
                    else
                    {
                        ret[retIndex++] = a[aIndex++];
                    }
                }
            }
        }
        

        要让它与您的数据一起工作,您需要更改输入数组并提供您自己的比较函数(您可以将其作为委托传入)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-13
          • 1970-01-01
          • 2019-02-22
          • 2011-06-09
          • 2019-11-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多