• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

请教各位高手一个算法,两个集合对比内容

candypill 2021-08-15 22:35:43

集合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

 

最好能给段代码,多谢

...全文
120 点赞 收藏 8
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复

我先发个代码,具体怎么调整,你看明白自己弄,主要在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();
            }
        }

       
    }

回复
candypill 08-17
@wanghui0380 多谢
回复
xuzuning 08-16

在你给的数据中,并没有符合比对条件 的条目,所以无需比较,自然也就没有代码了

回复
candypill 08-16
@xuzuning 建议和我一块搬个板凳向高手们学习
回复

如果你确定,没有重复的数据,请用先实现IEqualityComparer,然后用ConcurrentDictionary<> 代替你的集合

用ConcurrentDictionary<>只是因为我不想费那个力气写代码,想直接用AddOrUpdate() 方法。

key:前2个就好。
AddOrUpdate() 这个方法里在判定第3个,写到这里,我不确定你的key是前2个,还是前3个(比对条件是如果首字母相同并且第三个,描述上让我有些凌乱)

回复
candypill 08-16
@wanghui0380 两集合没有重复数据,比对条件是说,根据集合1记录对比集合2,比方集合1里是A,15.22,15.22,在2里A,15.22,15,这时就把1里A那行的SIZE2用集合2里A那行的替换成SIZE1生成新的行,A~SIZE1~15.22~15.22
回复
assky124 08-16

用~分割字符串,生成对象 {name="A",pro1="SIZE2",v1="15.22",v2="15.22",v2="15.22"} 这样,然后属性分析一下,得到新对象,最后拼接字符串

回复
candypill 08-16
@assky124 因为实际情况两个集合比较大,每个集合几W条记录,~有100个左右,有没有更高效些的办法 分割再拼接的办法是需要两层循环吧
回复
相关推荐
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
编辑了帖子
2021-08-15 22:44
编辑了帖子
2021-08-15 22:43
创建了帖子
2021-08-15 22:35
社区公告

让您成为最强悍的C#开发者