C# 如何执行linq查询以查找数据集中存在于集合的每个记录中的字段?
我有一个包含10K条记录的XML数据集,每个记录包含一组字段 我想知道在与数据集匹配的数据库模式中,哪些字段需要为null,哪些字段可以为非null linq是否提供了生成大型交叉口的方法 例如:C# 如何执行linq查询以查找数据集中存在于集合的每个记录中的字段?,c#,linq,linq-to-xml,set-intersection,C#,Linq,Linq To Xml,Set Intersection,我有一个包含10K条记录的XML数据集,每个记录包含一组字段 我想知道在与数据集匹配的数据库模式中,哪些字段需要为null,哪些字段可以为非null linq是否提供了生成大型交叉口的方法 例如: <set> <item> <a/> <foo /> <b/> <c/> </item> <item> <a/> <foo /> <b/&
<set>
<item>
<a/>
<foo />
<b/>
<c/>
</item>
<item>
<a/>
<foo />
<b/>
<c/>
</item>
<item>
<a/>
<b/>
</item>
<item>
<a/>
<foo />
<b/>
</item>
</set>
预期结果:
{ "a", "b" }
您可以使用GroupBy并将组大小与元素总数进行比较:
XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item><item><a/><b/></item><item><a/><foo /><b/></item></set>");
var items = doc.Document.Element("set").Elements("item");
var commonElementNames = items.SelectMany(x => x.Elements()) // Get all immediate children
.GroupBy(x => x.Name) // Group by name
.Where(g => g.Count() == items.Count()) // Filter for only those which show in every group.
.Select(g => g.Key.LocalName) // Select just the element names
;
XDocument doc=XDocument.Parse(“”);
var项目=单据单据要素(“集合”)。要素(“项目”);
var commonElementNames=items.SelectMany(x=>x.Elements())//获取所有直接子级
.GroupBy(x=>x.Name)//按名称分组
.Where(g=>g.Count()==items.Count())//仅筛选每个组中显示的项目。
.Select(g=>g.Key.LocalName)//只选择元素名称
;
在下面的代码中,selectedValue是非空列
XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item></set>");
var items =
doc.Descendants("item")
.Select(x=>x.Descendants().Select(y=>y.Name).ToList()).ToList();
var selectValue = items[0];
foreach (var item in items)
{
selectValue = selectValue.Intersect(item).ToList();
}
XDocument doc=XDocument.Parse(“”);
可变项目=
文件副本(“项目”)
.Select(x=>x.subjects().Select(y=>y.Name).ToList()).ToList();
var-selectValue=items[0];
foreach(项目中的var项目)
{
selectValue=selectValue.Intersect(item.ToList();
}
但是,如果在一个节点下有多个子元素(例如,“”在“”中出现两次),则这不起作用。
XDocument doc = XDocument.Parse("<set><item><a/><foo /><b/><c/></item><item><a/><foo /><b/><c/></item></set>");
var items =
doc.Descendants("item")
.Select(x=>x.Descendants().Select(y=>y.Name).ToList()).ToList();
var selectValue = items[0];
foreach (var item in items)
{
selectValue = selectValue.Intersect(item).ToList();
}