tags:

views:

44

answers:

1

I have a settingspropertyvaluecollection.I dont want to loop through all the properties using a for each loop.Instead i want to query the collection.How do i do that?is there a way to use LINQ and do it?

Thanks

A: 

SettingsPropertyValueCollection doesn't implement IEnumerable<T> but it does implement IEnumerable. If you want to query it using LINQ you have a couple of options.

You could create a Where() extension method that takes IEnumerable and a query and performs the query for you:

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));
    }
}

assuming:

var settings = new SettingsPropertyValueCollection
    {
        new SettingsPropertyValue(new SettingsProperty("Email")
            {
                DefaultValue = "[email protected]",
                PropertyType = typeof(string)
            }),
        new SettingsPropertyValue(new SettingsProperty("City")
            {
                DefaultValue = "Austin",
                PropertyType = typeof(string)
            }),
        new SettingsPropertyValue(new SettingsProperty("State")
            {
                DefaultValue = "TX",
                PropertyType = typeof(string)
            })
    };

usage would be:

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

alternatively you could use the LINQ Cast<T> operator to query the settings:

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

if you expect only one possible match then use FirstOrDefault() instead of Where()

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