下面是我的课:
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/