如何将其写为非LINQ代码?

时间:2011-08-29 18:32:41

标签: c# linq excel

我找到了一些如何从Excel电子表格>> HERE <<中读取XML的示例,我试图让代码对我有用。我必须编写一个例程,从工作簿中的15个表中的4个中获取数据,并使用该数据填充我们的数据库。无论如何....

每次尝试查询Excel电子表格时,此代码都会抛出InvalidOperationException个异常:

static XElement GetWorksheet(string sheetName, PackagePartCollection allParts) {
  XElement element = null;
  try {
    PackagePart worksheetPart = (from part in allParts
                                 where part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName))
                                 select part).Single();
    element = XElement.Load(XmlReader.Create(worksheetPart.GetStream()));
  } catch (Exception err) { // catches InvalidOperationException
    Console.WriteLine(err.Message);
  }
  return element;
}

具体错误是,“序列不包含元素”

我真的不确定如何调试它,因为我不确定代码试图做什么。

在尝试实现花哨的LINQ表达式之前,有人可以帮助我用标准“C#”编写吗?( LINQ,对吗?)

[解决]

使用JeffN825提供的代码段,我能够创建:

static XElement GetWorksheet(string sheetName, PackagePartCollection allParts) {
  string xmlCompare = string.Format("/xl/worksheets/{0}.xml", sheetName);
  foreach (PackagePart part in allParts) {
    string original = part.Uri.OriginalString;
    if (original == xmlCompare) {
      XElement element = XElement.Load(XmlReader.Create(part.GetStream()));
      return element;
    }
  }
  return null;
}

事实证明,即使我在Excel中的工作表名称是“HV”,“M2”,“CB”和“CC”,我仍然必须将它们指定为“sheet2”,“sheet3”,“sheet4”和“sheet5”。

我必须单步执行161 PackagePart个对象来查看此内容。

LINQ的效率非常高,以至于在出现问题时很难调试。

3 个答案:

答案 0 :(得分:3)

.Single()正在抛出异常。要么您的查询没有返回任何项目,要么返回&gt; 1项。如果你不确定你期望的项目数量,那么你应该使用FirstOrDefault()来返回第一场比赛,如果没有找到匹配则为null。

非LINQ等价物是这样的

PackagePart worksheetPart = null
foreach(var part in allParts)
{
   if (part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName))))
   {
       if (part != null) throw new InvalidOperationException(); // > 1 match
       worksheetPart = part;
   }
}
if (part == null) throw new InvalidOperationException(); // no match

答案 1 :(得分:2)

基本上是这样做的。

PackagePart worksheetPart;

foreach(PackagePart part in allParts)
{
    if(part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName)))
    { 
        worksheetPart = part;
        break;
    }
}

在您的版本中,尝试使用.FirstOrDefault()替换.Single()。

它失败了,因为没有匹配。

答案 2 :(得分:2)

(from part in allParts
  where part.Uri.OriginalString.Equals(String.Format("/xl/worksheets/{0}.xml", sheetName))
  select part).Single();

您的错误在Single()。如果您的查询中没有值,则Single()会抛出该异常。您应该使用的是SingleOrDefault(),如果查询中没有值,它将返回null