如何执行linq查询以查找数据集中存在于集合的每个记录中的字段?

时间:2011-11-09 19:28:41

标签: c# linq linq-to-xml set-intersection

我有一个包含10K记录的XML数据集,每个记录都包含一组字段。

我想知道哪些字段需要为null,哪些字段在与数据集匹配的数据库模式中可以为非null。

linq是否提供了产生大交叉的方法?

示例:

<set>
 <item>
  <a/>
  <foo />
  <b/>
  <c/>
 </item>
 <item>
   <a/>
   <foo />
   <b/>
   <c/>
  </item>
 <item>
   <a/>
   <b/>
 </item>
 <item>
   <a/>
   <foo />
   <b/>
  </item>
</set>

原型:

string[] CommonFieldNames(XElement[] elements)
{
  // ...
}

期望的结果:

{ "a", "b" }

2 个答案:

答案 0 :(得分:3)

在下面的代码中,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();
 }

答案 1 :(得分:0)

您可以使用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
                              ;