3

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

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

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" }
4

2 回答 2

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();
 }
于 2011-11-09T19:43:19.110 回答
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
                              ;
于 2011-11-09T19:36:04.777 回答