Linq to Objects, где предложение и приведение типов - PullRequest
1 голос
/ 16 марта 2012

У меня есть следующее:

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

Теперь, что я хочу сделать, это вытащить DisplayName конкретной опции, которая соответствует StoredValue.

Раньше я повторялВся коллекция, пока я не нашел совпадение.Но я бы предпочел что-то, что выглядело бы немного лучше ...

Я начал с

var found = (from c in c.Options
             where ...

И вот где я застрял.

Ответы [ 4 ]

3 голосов
/ 16 марта 2012

Я думаю, что это то, что вы хотите: (Single выдаст ошибку, если найдено 0 или более 1 совпадений)

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;
2 голосов
/ 16 марта 2012
var found = (from c in c.Options.OfType<Option>()
             where c.StoredValue == yourValue
             select c.DisplayName).FirstOrDefault();
2 голосов
/ 16 марта 2012

Это должно сделать это:

c.Options.OfType<Option>()
 .Where(o => o.StoredValue == "aaaa")
 .Select(o => o.DisplayName)
 .SingleOrDefault();  //or .ToList() 
1 голос
/ 16 марта 2012

Это с помощью Linqpad.Сначала вам нужно привести в качестве типа Option, а затем использовать его.Я ставлю чек, чтобы найти все типы, затем проверяю значение.

...