如何查询settingspropertyvaluecollection

时间:2010-04-01 10:21:53

标签: linq

我有一个settingspropertyvaluecollection.I不想使用for循环遍历所有属性。我想要查询集合。我该怎么做?有没有办法使用LINQ并做到了?

由于

2 个答案:

答案 0 :(得分:0)

SettingsPropertyValueCollection未实现IEnumerable< T>但它确实实现了IEnumerable。如果你想使用LINQ查询它,你有几个选择。

您可以创建一个Where()扩展方法,该方法接受IEnumerable和查询并为您执行查询:

public static class IEnumerableExtensions
{
    public static IEnumerable<T> Where<T>(this IEnumerable input, Func<T,bool> query)
    {
        return input.Cast<T>().Where(item => query(item));
    }
}

假设:

var settings = new SettingsPropertyValueCollection
    {
        new SettingsPropertyValue(new SettingsProperty("Email")
            {
                DefaultValue = "a@a.com",
                PropertyType = typeof(string)
            }),
        new SettingsPropertyValue(new SettingsProperty("City")
            {
                DefaultValue = "Austin",
                PropertyType = typeof(string)
            }),
        new SettingsPropertyValue(new SettingsProperty("State")
            {
                DefaultValue = "TX",
                PropertyType = typeof(string)
            })
    };

用法是:

var matches = settings.Where<SettingsPropertyValue>(x => x.Name == "City")

或者你可以使用LINQ Cast&lt; T&gt;运算符查询设置:

var matches = settings.Cast<SettingsPropertyValue>()
                      .Where(x => x.Name == "City");

如果您只希望有一个匹配,那么请使用FirstOrDefault()而不是Where()

var match = settings.Cast<SettingsPropertyValue>()
                    .FirstOrDefault(x => x.Name == "City");

答案 1 :(得分:0)

回答问题已有一段时间,此后许多事情都发生了变化。 您可以将SettingsPropertyValueCollection强制转换为列表(或其他容器)并立即对其进行查询。 因此,这将是当今我的解决方案:

SettingsPropertyValueCollection settings = Properties.Settings.Default.PropertyValues
settings.Cast<SettingsPropertyValue>().ToList().Where(p => p.Name == "myProperty");