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