Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq查询查找带有检查的超集_C#_Linq - Fatal编程技术网

C# Linq查询查找带有检查的超集

C# Linq查询查找带有检查的超集,c#,linq,C#,Linq,我想查询一个包含一些重复文本、带/不带id值的列表 我有两个条件要匹配 选择任意两个ID相同的[文本,类型]组,否则选择唯一的组 任意两个文本,其中一个包含另一个,将选择超级集文本。[唱歌,跳舞唱歌=>跳舞唱歌] 预期产出: 这是丑陋的,但它的工作: class Program { static void Main(string[] args) { List<Record> records = BuildTestData();

我想查询一个包含一些重复文本、带/不带id值的列表

我有两个条件要匹配

  • 选择任意两个ID相同的[文本,类型]组,否则选择唯一的组
  • 任意两个文本,其中一个包含另一个,将选择超级集文本。[唱歌,跳舞唱歌=>跳舞唱歌]
  • 预期产出:


    这是丑陋的,但它的工作:

    class Program
    {
        static void Main(string[] args)
        {
            
            List<Record> records = BuildTestData();
            List<Record> deduped = DeDupe(records);
            Console.Clear();
    
            foreach (Record r in deduped)
                Console.WriteLine($"Type:{r.Typ}, Text:{r.Txt}, ID:{r.ID} ");
    
            Console.ReadKey();
        }
    
    
        static List<Record> DeDupe(List<Record> dupes)
        {
            List<Record> excludes = new List<Record>();
            excludes.AddRange(dupes.GroupBy(x => new { x.Typ, x.Txt }).Where(y => y.Count() > 1).SelectMany(z => z.Where(a => string.IsNullOrEmpty(a.ID))));
            excludes.AddRange(dupes.Where(x => !excludes.Any(y => x == y) && dupes.Any(z => x != z && x.Txt != z.Txt && z.Txt.Contains(x.Txt))));
            return dupes.Where(x => !excludes.Any(y => x == y)).ToList();
        }
    
    
        static List<Record> BuildTestData()
        {
            return new List<Record>
            {
                new Record { Typ = "Name", Txt = "John", ID = null},
                new Record { Typ = "Name", Txt = "John", ID = "22"},
                new Record { Typ = "Name", Txt = "John Smith", ID = "2548"},
                new Record { Typ = "Hobby", Txt = "Singing", ID = null},
                new Record { Typ = "Hobby", Txt = "Dancing Singing", ID = null},
                new Record { Typ = "School", Txt = "XYZ", ID = null},
                new Record { Typ = "School", Txt = "XYZ", ID = "242"},
            };
        }
    }
    
    public class Record
    { 
        public string Typ { get; set; }
        public string Txt { get; set; }
        public string ID { get; set; }
    }
    
    类程序
    {
    静态void Main(字符串[]参数)
    {
    列表记录=BuildTestData();
    列表重复数据删除=重复数据删除(记录);
    Console.Clear();
    foreach(在重复数据消除中记录r)
    WriteLine($”类型:{r.Typ},文本:{r.Txt},ID:{r.ID}”);
    Console.ReadKey();
    }
    静态列表重复数据消除(列表重复)
    {
    列表排除=新列表();
    excludes.AddRange(dups.GroupBy(x=>new{x.Typ,x.Txt})。其中(y=>y.Count()>1)。SelectMany(z=>z.Where(a=>string.IsNullOrEmpty(a.ID));
    excludes.AddRange(dupes.Where(x=>!excludes.Any(y=>x==y)&&dupes.Any(z=>x!=z&&x.Txt!=z.Txt&&z.Txt.Contains(x.Txt));
    返回重复。其中(x=>!excludes.Any(y=>x==y)).ToList();
    }
    静态列表BuildTestData()
    {
    返回新列表
    {
    新记录{Typ=“Name”,Txt=“John”,ID=null},
    新记录{Typ=“Name”,Txt=“John”,ID=“22”},
    新记录{Typ=“Name”,Txt=“John Smith”,ID=“2548”},
    新记录{Typ=“Hobby”,Txt=“Singing”,ID=null},
    新记录{Typ=“Hobby”,Txt=“Dancing sing”,ID=null},
    新记录{Typ=“School”,Txt=“XYZ”,ID=null},
    新记录{Typ=“School”,Txt=“XYZ”,ID=“242”},
    };
    }
    }
    公开课记录
    { 
    公共字符串类型{get;set;}
    公共字符串Txt{get;set;}
    公共字符串ID{get;set;}
    }
    
    John,ID=22是唯一的。约翰·史密斯的ID=2548也是如此。为什么要选择一个而不是另一个呢?因为约翰·史密斯包含约翰的超集要求使得这更复杂。在我看来,这也是非常模糊和武断的。例如,您将如何判断“约翰”是属于“约翰·史密斯”还是“约翰·韦恩”@Abion47对于“冠状动脉疾病”和“动脉疾病”这两个字符串,我需要拉“冠状动脉疾病”。“左动脉疾病”这可能是另一个独特的组合。@A开发者你没有抓住要点。如果你有两个唯一的组合,然后你遇到一个子集组合,可以放入任何一个超集呢?如果你有“约翰·史密斯”和“约翰·韦恩”,然后又有一个“约翰”,你会更新哪个超集?二者都也不这对早期的约翰·史密斯来说意味着什么呢?早在你的算法知道约翰·韦恩的存在之前,约翰·史密斯就合并了?以这种方式处理数据集可能会产生一系列潜在问题,因此我希望此练习是针对学校或实践,而不是针对生产代码。我仍然很好奇,这将如何处理在“John Smith”之后添加的“John Wayne”,然后是另一个记录,同样也是“John”。OP将是最好的一个告诉您的记录。我猜这是一个家庭作业问题。。。你的问题太真实了。我鄙视像这样的家庭作业问题。他们训练你对潜在的数据集做出糟糕的假设。@Sam谢谢你的回答,这有助于形成查询
    Type      Text            Id
    
    Name      John Smith      2548
    Hobby     Dancing Singing
    School    XYZ             242
    
    class Program
    {
        static void Main(string[] args)
        {
            
            List<Record> records = BuildTestData();
            List<Record> deduped = DeDupe(records);
            Console.Clear();
    
            foreach (Record r in deduped)
                Console.WriteLine($"Type:{r.Typ}, Text:{r.Txt}, ID:{r.ID} ");
    
            Console.ReadKey();
        }
    
    
        static List<Record> DeDupe(List<Record> dupes)
        {
            List<Record> excludes = new List<Record>();
            excludes.AddRange(dupes.GroupBy(x => new { x.Typ, x.Txt }).Where(y => y.Count() > 1).SelectMany(z => z.Where(a => string.IsNullOrEmpty(a.ID))));
            excludes.AddRange(dupes.Where(x => !excludes.Any(y => x == y) && dupes.Any(z => x != z && x.Txt != z.Txt && z.Txt.Contains(x.Txt))));
            return dupes.Where(x => !excludes.Any(y => x == y)).ToList();
        }
    
    
        static List<Record> BuildTestData()
        {
            return new List<Record>
            {
                new Record { Typ = "Name", Txt = "John", ID = null},
                new Record { Typ = "Name", Txt = "John", ID = "22"},
                new Record { Typ = "Name", Txt = "John Smith", ID = "2548"},
                new Record { Typ = "Hobby", Txt = "Singing", ID = null},
                new Record { Typ = "Hobby", Txt = "Dancing Singing", ID = null},
                new Record { Typ = "School", Txt = "XYZ", ID = null},
                new Record { Typ = "School", Txt = "XYZ", ID = "242"},
            };
        }
    }
    
    public class Record
    { 
        public string Typ { get; set; }
        public string Txt { get; set; }
        public string ID { get; set; }
    }