Linq to Objects where子句和类型转换
本文关键字:类型转换 子句 where to Objects Linq | 更新日期: 2023-09-27 18:27:53
我有以下内容:
class BaseType {
public Int32 Id { get; set; }
}
class Option : BaseType {
public String DisplayName { get; set; }
public String StoredValue { get; set; }
}
class Container {
public Collection<BaseType> Options;
}
Container c = new Container();
c.Options.add(new Option() { Id=1, DisplayName="Bob", StoredValue="aaaa"});
c.Options.add(new Option() { Id=2, DisplayName="Dora", StoredValue="bbbb"});
c.Options.add(new Option() { Id=3, DisplayName="Sara", StoredValue="cccc"});
现在,我想做的是提取与StoredValue匹配的特定选项的DisplayName。
以前,我会遍历整个集合,直到找到匹配项。但是,我宁愿要一个看起来更好一点的。。。
我开始使用
var found = (from c in c.Options
where ...
这就是我陷入困境的地方。
我认为这就是您想要的:(如果找到0或多于1个匹配,Single
将出错)
string searchValue = "aaaa";
string displayName = c.Options.OfType<Option>.Single(o => o.StoredValue == searchValue).DisplayName;
或者允许多个值:(这将为您提供所有匹配的显示名称,0到多)
IEnumerable<string> displayNames = from o in c.Options.OfType<Option>
where o.StoredValue == searchValue
select o.DisplayName;
这应该做到:
c.Options.OfType<Option>()
.Where(o => o.StoredValue == "aaaa")
.Select(o => o.DisplayName)
.SingleOrDefault(); //or .ToList()
var found = (from c in c.Options.OfType<Option>()
where c.StoredValue == yourValue
select c.DisplayName).FirstOrDefault();
这是在使用Linqpad。你需要先转换为Option类型,然后才能使用它。我检查了所有类型,然后检查值。
void Main()
{
Container c = new Container();
c.Options.Add(new Option() { Id=1, DisplayName="Bob", StoredValue="aaaa"});
c.Options.Add(new Option() { Id=2, DisplayName="Dora", StoredValue="bbbb"});
c.Options.Add(new Option() { Id=3, DisplayName="Sara", StoredValue="cccc"});
var t = from x in c.Options.OfType<Option>()
where x.DisplayName == "Bob"
select x.StoredValue;
t.Dump();
}
class BaseType {
public Int32 Id { get; set; }
}
class Option : BaseType {
public String DisplayName { get; set; }
public String StoredValue { get; set; }
}
class Container {
public List<BaseType> Options;
public Container() { Options = new List<BaseType>(); }
}