111,094
社区成员




集合1
A~SIZE2~15.22~15.22~15.22
B~SIZE1~15.22~15.22~15.22
C~SIZE1~15.22~15.22~15.22
集合2
A~SIZE1~15.22~15~15.22
B~SIZE2~15.22~15.22~15.22
C~SIZE2~15.22~15~15.22
想得到集合3
比对条件是如果首字母相同并且第三个~后数字不同时,就用集合2的SIZE1内容替换集合1中SIZE,集合1其他内容不变生成集合3
A~SIZE1~15.22~15.22~15.22
B~SIZE1~15.22~15.22~15.22
C~SIZE2~15.22~15.22~15.22
最好能给段代码,多谢
我先发个代码,具体怎么调整,你看明白自己弄,主要在addorupdata 那个方法(因为我依旧不明白,你要怎么个替换,只看明白要第1列和第3列做联合主键)
class Program
{
static void Main(string[] args)
{
ConcurrentDictionary<MyClass, MyClass> dic = new ConcurrentDictionary<MyClass, MyClass>(new MyClass());
//第一部分数据
List<MyClass> lst1 = new List<MyClass>();
lst1.Add(new MyClass("A~SIZE2~15.22~15.22~15.22"));
lst1.Add(new MyClass("B~SIZE1~15.22~15.22~15.22"));
lst1.Add(new MyClass("C~SIZE1~15.22~15.22~15.22"));
//第2部分数据
List<MyClass> lst2 = new List<MyClass>();
lst2.Add(new MyClass("A~SIZE1~15.22~15~15.22"));
lst2.Add(new MyClass("B~SIZE2~15.22~15.22~15.22"));
lst2.Add(new MyClass("C~SIZE2~15.22~15~15.22"));
foreach (var myClass in lst1)
{
dic.TryAdd(myClass, myClass);
}
foreach (var myClass in lst2)
{
dic.AddOrUpdate(myClass, p => p, (p1, p2) => myClass);
}
foreach (var keyValuePair in dic)
{
Console.WriteLine(keyValuePair.Value.data);
}
}
class MyClass:IEqualityComparer<MyClass>
{
private string _data;
private string node { get; set; }
private string node3 { get; set; }
private string key => node + node3;
public MyClass()
{
}
public MyClass(string str)
{
this.data = str;
}
public string data
{
get => _data;
set
{
_data = value;
//demo 我就不做啥校验了,你自己保证数据准确
string[] b = _data.Split('~');
node = b[0];
node3 = b[2];
}
}
public bool Equals(MyClass x, MyClass y)
{
return x.node.Equals(y.node) && x.node3.Equals(y.node3);
}
public int GetHashCode(MyClass obj)
{
return obj.key.GetHashCode();
}
}
}
在你给的数据中,并没有符合比对条件 的条目,所以无需比较,自然也就没有代码了
如果你确定,没有重复的数据,请用先实现IEqualityComparer,然后用ConcurrentDictionary<> 代替你的集合
用ConcurrentDictionary<>只是因为我不想费那个力气写代码,想直接用AddOrUpdate() 方法。
key:前2个就好。
AddOrUpdate() 这个方法里在判定第3个,写到这里,我不确定你的key是前2个,还是前3个(比对条件是如果首字母相同并且第三个,描述上让我有些凌乱)