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 ...

这就是我陷入困境的地方。

Linq to Objects 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>(); }
}