下面是我的课:

public class Regions
    {
        public int Id { get; set; }
        public string[] ParentName { get; set; }
    }

现在我有 2 个上面区域类的列表,如下所示,包含一些数据:
var region1 = new Regions();
var region2 = new Regions();

现在 ParentName 包含如下 region1 的数据:
[0] : Abc.mp3,Pqr.mp3
[1] : Xxx.mp3
[2] : kkk.mp3
[3] : ppp.mp3,zzz.mp3,rrr.mp3,ddd.mp3

现在 ParentName 包含如下 region2 的数据:
[0] : Abc.mp3,Pqr.mp3,lmn.mp3
[1] : rrr.mp3,ggg.mp3,yyy.mp3

现在我试图将 region2 的 ParentName 合并到 region1,如果 region1 的任何部分在用逗号分割记录后与 region2 匹配,如下所示:
[0] : Abc.mp3,Pqr.mp3,lmn.mp3
[1] : Xxx.mp3
[2] : kkk.mp3
[3] : ppp.mp3,zzz.mp3,rrr.mp3,ddd.mp3,ggg.mp3,yyy.mp3

现在在上面的预期输出中,Abc.mp3 和 Pqr.Mp3(Region1 和 Region2)匹配,只有 Lmn.mp3 不匹配,因此它将被附加到 Region1 的末尾。

对于 region1 和 region2 的最后一条记录,rrr.mp3 匹配(单个匹配也足够),因此 region2 的非匹配记录,即 ggg.mp3,yyy.mp3 将附加到 region1 的末尾。

输出我进入 Region1:
[0] : Abc.mp3,Pqr.mp3
[1] : Xxx.mp3
[2] : kkk.mp3
[3] : ppp.mp3,zzz.mp3,rrr.mp3,ddd.mp3
[4] : Abc.mp3,Pqr.mp3,lmn.mp3
[3] : rrr.mp3,ggg.mp3,yyy.mp3

代码:
region1.ParentName = region1.ParentName.Concat(region2.ParentName).Distinct().ToArray();


public static T[] Concat<T>(this T[] x, T[] y)
        {
            if (x == null) throw new ArgumentNullException("x");
            if (y == null) throw new ArgumentNullException("y");
            int oldLen = x.Length;
            Array.Resize<T>(ref x, x.Length + y.Length);
            Array.Copy(y, 0, x, oldLen, y.Length);
            return x;
        }

最佳答案

目前尚不清楚您的名称是否包含重复项以及如何处理它们,但这是使用指定输入产生所需结果的 LINQ 解决方案:

var e2Sets = region2.ParentName.Select(e2 => e2.Split(',')).ToList();
var result =
    from e1 in region1.ParentName
    let e1Set = e1.Split(',')
    let e2AppendSet = (
       from e2Set in e2Sets
       where e1Set.Intersect(e2Set).Any()
       from e2New in e2Set.Except(e1Set)
       select e2New
    ).Distinct()
    select string.Join(",", e1Set.Concat(e2AppendSet));
result.ToArray() 将为您提供所需的新 region1.ParentName

工作原理:

由于我们基本上需要两个输入序列的笛卡尔积,所以我们首先准备一个第二个序列的拆分字符串数组的列表,以避免内循环中出现多个 string.Split

对于第一个序列的每个元素,我们将其拆分为字符串数组,对于第二个序列中具有匹配项(使用 Intersect 方法确定)的每个拆分数组,我们使用 Except 方法选择不匹配的字符串。然后我们展平所有不匹配的字符串,应用 Distinct 删除潜在的重复项,连接两个集合并使用 string.Join 生成新的逗号分隔字符串。

关于c# - 尝试基于比较合并两个字符串数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42652101/

10-13 06:22