我有一个settingspropertyvaluecollection.I不想使用for循环遍历所有属性。我想要查询集合。我该怎么做?有没有办法使用LINQ并做到了?
由于
答案 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");