在C#中合并两个数组

时间:2019-01-29 16:42:47

标签: c# arrays .net

在我的代码中,我有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

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

5 个答案:

答案 0 :(得分:4)

using System.Collections;

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

答案 1 :(得分:1)

最简单的方法是:

将数组转换为列表:

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

将两个列表合并在一起:

List1.AddRange(List2);

并对它们进行排序。

List1.Sort();

答案 2 :(得分:0)

从给定的示例输出中,它看起来似乎不是按字母顺序排序的。在这种情况下,您需要在使用并集后与CustomBy子句一起使用自定义比较器。

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

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

输出

enter image description here

答案 3 :(得分:0)

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

此代码可以改进...

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 :(得分:0)

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

请注意,它不进行任何排序-它依赖于要排序的输入。它只是从两个数组之一的当前位置中选择值较低的项,以传输到输出数组。结果是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++];
            }
        }
    }
}

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