2012-03-15 2 views
1

я имею следующее:Linq к объектам, где положение и типажи

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

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

ответ

2

Это следует сделать это:

c.Options.OfType<Option>() 
.Where(o => o.StoredValue == "aaaa") 
.Select(o => o.DisplayName) 
.SingleOrDefault(); //or .ToList() 
+0

c.Опции - это коллекция . o.StoredValue не существует ... – NotMe

+0

@ Крис: вы правы! Я исправил код. – David

+0

Это плохой ответ, если у вас есть другой тип, он будет раздуваться. – CrazyDart

3

Я думаю, что это то, что вы хотите: (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; 
+0

c.Опции - это коллекция . x.StoredValue не существует ... – NotMe

+0

О, теперь я понимаю, почему это вас путало в первую очередь! Я исправил код, используя расширение ['OfType'] (http://msdn.microsoft.com/en-us/library/bb360913.aspx), которое фильтрует список опций типа' Option', не заставляя вас писать логика для него (и ввести ошибки, как и другие ответы). –

2
var found = (from c in c.Options.OfType<Option>() 
      where c.StoredValue == yourValue 
      select c.DisplayName).FirstOrDefault(); 
1

Использование 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>(); } 
} 
+0

Я не могу изменить контейнер Варианты использования списка <>. Когда я пытаюсь это сделать, это ошибки в части .OfType

+0

Интересно, потому что он работает отлично в моей системе. – CrazyDart

+0

это работает для меня либо –

Смежные вопросы