C# LINQ查询将多个与多个进行比较
更新:抱歉我的同事稍微更新了模型 更新:考虑到这个想法的背景,也许会有所帮助 我有一个节目的ShowData列表。每个ShowData都包含大量打印。所以 1个显示->多个显示数据->多个打印 我有两个数据集,都是相同类型的对象-ShowData 指纹如下所示:C# LINQ查询将多个与多个进行比较,c#,linq,entity-framework,C#,Linq,Entity Framework,更新:抱歉我的同事稍微更新了模型 更新:考虑到这个想法的背景,也许会有所帮助 我有一个节目的ShowData列表。每个ShowData都包含大量打印。所以 1个显示->多个显示数据->多个打印 我有两个数据集,都是相同类型的对象-ShowData 指纹如下所示: public class ShowData { public ShowData() { } public int time { get; set; } public List<Prints&
public class ShowData
{
public ShowData() { }
public int time { get; set; }
public List<Prints> prints { get; set; }
}
public class Prints
{
public Prints() { }
public int value { get; set; }
public string range { get; set; }
}
TimeInDataSetB TimesInDataSetAForLows TimeInDataSetAForHighs
1 1,3,5 3,4
2 5
例如:
DATASET A
time prints
1 {1,low},{4,low},{8,low},{9,low},{10,low},{11,high},{15,high},{16,high},{18,high}
2 {4,low},{7,low},{8,low},{9,low},{10,low},{12,high},{15,high},{16,high},{19,high}
3 {1,low},{2,low},{3,low},{8,low},{9,low},{11,high},{12,high},{15,high},{16,high}
4 {1,low},{7,low},{8,low},{9,low},{10,low},{11,high},{12,high},{14,high},{15,high}
5 {1,low},{5,low},{6,low},{8,low},{9,low},{11,high},{14,high},{17,high},{19,high}
DATASET B
time prints
1 {1,low},{2,low},{3,low},{4,low},{5,low},{11,high},{12,high},{13,high},{18,high}
2 {0,low},{3,low},{5,low},{6,low},{7,low},{11,high},{13,high},{19,high},{20,high}
第一个数据集(数据集A)大约有4000个ShowData项。我还有另一个ShowData数据集,大约有120个项目长(数据集B)
我试图找到一种方法来比较这两个列表,以显示所有时间点,其中数据集B中的打印与数据集a中的打印至少有2个匹配。但是,对于低值,需要至少有2个匹配,对于高值,需要至少有2个匹配
因此,我返回的查询可能如下所示:
public class ShowData
{
public ShowData() { }
public int time { get; set; }
public List<Prints> prints { get; set; }
}
public class Prints
{
public Prints() { }
public int value { get; set; }
public string range { get; set; }
}
TimeInDataSetB TimesInDataSetAForLows TimeInDataSetAForHighs
1 1,3,5 3,4
2 5
如上所述,数据集B中时间1处的打印(范围=低)与数据集B中时间1,3,5处的打印至少有2次匹配,数据集B中时间1处的打印(范围=高)与数据集B中时间3,4处的打印至少有2次匹配
DataSetB中时间2的项与数据集中的任何低值项均不匹配,而与高值项仅匹配1项
有人能帮忙吗?(我在用c#寻找答案)
使用第一个答案中描述的方法,我尝试了以下方法:
var query3 = from a in recordingPoints
from b1 in ShowData1
let timeIntersects = a.Prints.Intersect(b1.prints, printsEqualityComparer)
where timeIntersects.GroupBy(x => x.Range)
.All(x => x.Count() > 2)
group b1 by a.Time into grouped
select new
{
TimeInDataSetA = grouped.Key,
TimeInDataSetB = grouped.ToArray()
};
其中recordingPoints是显示数据的列表
要测试的数据集
List<ShowData> bigdataset = new List<Ent.ShowData>();
List<ShowData> smalldataset = new List<Ent.ShowData>();
List<int> ints = new List<int>(new int[]{1, 4, 8, 9, 10, 11, 15, 16, 18});
ShowData od = new Ent.ShowData();
od.Show.Id = 7;
foreach (int it in ints)
{
Prints pr = new Prints();
if (it < 11)
pr.Range = "low";
else
pr.Range = "high";
pr.Value = it.ToString();
od.Prints.Add(pr);
}
od.Time = 1;
bigdataset.Add(od);
ints = new List<int>(new int[] { 4, 7, 8, 9, 10, 12, 15, 16, 19 });
od = new Ent.ShowData();
od.Show.Id = 7;
foreach (int it in ints)
{
Prints pr = new Prints();
if (it < 11)
pr.Range = "low";
else
pr.Range = "high";
pr.Value = it.ToString();
od.Prints.Add(pr);
}
od.Time = 2;
bigdataset.Add(od);
ints = new List<int>(new int[] { 1, 2, 3, 8, 9, 11, 12, 15, 16 });
od = new Ent.ShowData();
od.Show.Id = 7;
foreach (int it in ints)
{
Prints pr = new Prints();
if (it < 11)
pr.Range = "low";
else
pr.Range = "high";
pr.Value = it.ToString();
od.Prints.Add(pr);
}
od.Time = 3;
bigdataset.Add(od);
ints = new List<int>(new int[] { 1, 7, 8, 9, 10, 11, 12, 14, 15 });
od = new Ent.ShowData();
od.Show.Id = 7;
foreach (int it in ints)
{
Prints pr = new Prints();
if (it < 11)
pr.Range = "low";
else
pr.Range = "high";
pr.Value = it.ToString();
od.Prints.Add(pr);
}
od.Time = 4;
bigdataset.Add(od);
ints = new List<int>(new int[] { 1, 5, 6, 8, 9, 11, 14, 17, 19 });
od = new Ent.ShowData();
od.Show.Id = 7;
foreach (int it in ints)
{
Prints pr = new Prints();
if (it < 11)
pr.Range = "low";
else
pr.Range = "high";
pr.Value = it.ToString();
od.Prints.Add(pr);
}
od.Time = 5;
bigdataset.Add(od);
ints = new List<int>(new int[] { 1, 2, 3, 4, 5, 11, 12, 13, 18 });
od = new Ent.ShowData();
foreach (int it in ints)
{
Prints pr = new Prints();
if (it < 11)
pr.Range = "low";
else
pr.Range = "high";
pr.Value = it.ToString();
od.Prints.Add(pr);
}
od.Time = 1;
smalldataset.Add(od);
ints = new List<int>(new int[] { 0, 3, 5, 6, 7, 11, 13, 19, 20 });
od = new Ent.ShowData();
foreach (int it in ints)
{
Prints pr = new Prints();
if (it < 11)
pr.Range = "low";
else
pr.Range = "high";
pr.Value = it.ToString();
od.Prints.Add(pr);
}
od.Time = 2;
smalldataset.Add(od);
var printsEqualityComparer = new PrintsEqualityComparer();
var query4 = from a in smalldataset
from b1 in bigdataset
let timeIntersects = a.Prints.Intersect(b1.Prints, printsEqualityComparer)
where timeIntersects.GroupBy(x => x.Range)
.All(x => x.Count() > 1)
group b1 by a.Time into grouped
select new
{
TimeInDataSetA = grouped.Key,
TimeInDataSetB = grouped.ToArray()
};
List bigdataset=newlist();
List smalldataset=新列表();
List ints=新列表(新的int[]{1,4,8,9,10,11,15,16,18});
ShowData od=new Ent.ShowData();
od.Show.Id=7;
foreach(以整数表示)
{
打印pr=新打印();
如果(它<11)
pr.Range=“低”;
其他的
pr.Range=“高”;
pr.Value=it.ToString();
od、打印、添加(pr);
}
od.时间=1;
添加(od);
ints=新列表(新的int[]{4,7,8,9,10,12,15,16,19});
od=新的Ent.ShowData();
od.Show.Id=7;
foreach(以整数表示)
{
打印pr=新打印();
如果(它<11)
pr.Range=“低”;
其他的
pr.Range=“高”;
pr.Value=it.ToString();
od、打印、添加(pr);
}
od.时间=2;
添加(od);
ints=新列表(新的int[]{1,2,3,8,9,11,12,15,16});
od=新的Ent.ShowData();
od.Show.Id=7;
foreach(以整数表示)
{
打印pr=新打印();
如果(它<11)
pr.Range=“低”;
其他的
pr.Range=“高”;
pr.Value=it.ToString();
od、打印、添加(pr);
}
od时间=3;
添加(od);
ints=新列表(新的int[]{1,7,8,9,10,11,12,14,15});
od=新的Ent.ShowData();
od.Show.Id=7;
foreach(以整数表示)
{
打印pr=新打印();
如果(它<11)
pr.Range=“低”;
其他的
pr.Range=“高”;
pr.Value=it.ToString();
od、打印、添加(pr);
}
od.时间=4;
添加(od);
ints=新列表(新的int[]{1,5,6,8,9,11,14,17,19});
od=新的Ent.ShowData();
od.Show.Id=7;
foreach(以整数表示)
{
打印pr=新打印();
如果(它<11)
pr.Range=“低”;
其他的
pr.Range=“高”;
pr.Value=it.ToString();
od、打印、添加(pr);
}
od.时间=5;
添加(od);
ints=新列表(新的int[]{1,2,3,4,5,11,12,13,18});
od=新的Ent.ShowData();
foreach(以整数表示)
{
打印pr=新打印();
如果(它<11)
pr.Range=“低”;
其他的
pr.Range=“高”;
pr.Value=it.ToString();
od、打印、添加(pr);
}
od.时间=1;
添加(od);
ints=新列表(新的int[]{0,3,5,6,7,11,13,19,20});
od=新的Ent.ShowData();
foreach(以整数表示)
{
打印pr=新打印();
如果(它<11)
pr.Range=“低”;
其他的
pr.Range=“高”;
pr.Value=it.ToString();
od、打印、添加(pr);
}
od.时间=2;
添加(od);
var printsEqualityComparer=新的printsEqualityComparer();
var query4=来自smalldataset中的
从bigdataset中的b1
让timeIntersects=a.Prints.Intersect(b1.Prints,printsEqualityComparer)
时间交叉的地方
// please see: http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx
class PrintsEqualityComparer : IEqualityComparer<Prints>
{
public bool Equals(Prints x, Prints y)
{
return object.Equals(x, y) && object.Equals(x.value, y.value);
}
public int GetHashCode(Prints obj)
{
return obj.range.GetHashCode() ^ obj.value.GetHashCode();
}
}
var printsEqualityComparer = new PrintsEqualityComparer();
var query = from a in listA
from b in listB
let timeIntersects = a.prints.Intersect(b.prints, printsEqualityComparer)
where timeIntersects.GroupBy(x => x.range)
.All(x => x.Count() > 2)
group b by a.time into grouped
select new
{
TimeInDataSetA = grouped.Key,
TimeInDataSetB = grouped.ToArray()
};