ConfigurationElementCollection LINQ

时间:2014-07-29 06:34:06

标签: c# linq app-config

我对LinQ有些问题。如何在查询或某些LinQ条件下按名称获取id?这是尝试得到:

var section = ConfigurationManager.GetSection("jobSection");

if (section != null)
{
    var jobs = (section as JobSection).Jobs;
    var item = from JobElement je in jobs where je.Name == "Job Name A" select je.Id;
    Console.WriteLine(item.ToString());
}

这是配置。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="jobSection" type="ConsoleApplication2.JobSection, ConsoleApplication2" />
    </configSections>
    <jobSection>
        <jobs>
            <job id="1" name="Job Name A" />
            <job id="2" name="Job Name B" />
        </jobs>
    </jobSection>
</configuration>

但这是输出:

  

System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [ConsoleApplication2.JobElement,System.Int32]

1 个答案:

答案 0 :(得分:4)

问题

当然可以 - 您正在打印Enumerable

由于通用接口上没有ToString的默认实现,它只打印了类型名称 - 这就是为什么你得到奇怪的答案。

基本解决方案:foreach

var section = ConfigurationManager.GetSection("jobSection");
if (section != null)
{
    var jobs = (section as JobSection).Jobs;
    var query = 
       from JobElement je in jobs 
       where je.Name == "Job Name A" 
       select je.Id;

    foreach(var item in query)
       Console.WriteLine(item.ToString());
}

如果它有助于将query视为一种懒惰的数组/列表 - 它只是等着你把它拉出来。

只期待一个元素?

顺便说一下 - 也许你期望得到一个结果。在这种情况下,您可以像这样使用.Single

var section = ConfigurationManager.GetSection("jobSection");
if (section != null)
{
    var jobs = (section as JobSection).Jobs;
    var query = 
       from JobElement je in jobs 
       where je.Name == "Job Name A" 
       select je.Id;
    var item = query.Single();
    Console.WriteLine(item.ToString());
}

如果结果中没有一个元素,则抛出此值。替代方案是:

  • .First(会给你第一个元素,如果没有则会抛出)
  • .FirstOrDefault(将为您提供第一个元素或默认值 - 如果没有项目,则最有可能null

重载/ linq的一些乐趣

如果您更深入地了解重载,您会发现可以将WhereFirst(等)部分组合在一起:

var section = ConfigurationManager.GetSection("jobSection");
if (section != null)
{
    var jobs = (section as JobSection).Jobs;
    var item = jobs.Cast<JobElement>()
                   .First(je => je.Name == "Job Name A");
    Console.WriteLine(item.Id);
}

玩得开心