2014-11-03 2 views
0

У меня есть объект телефона, как так:Какая коллекция позволяет мне искать по параметрам на объектах?

public string grade { get; set; } 
public string network { get; set; } 
public decimal price { get; set; } 

У меня есть цикл, в котором я синтаксический анализ исходных данных и на каждом проходе я создаю новый объект телефона. Теперь моя задача - определить коллекцию для хранения этих телефонных объектов.

Я не уверен, какую коллекцию мне нужно для них. Мне нужно уметь определять grade и network в моем коде и легко вернуться к цене, поэтому общий список не может быть и речи (я думаю). Должен ли я использовать многомерный массив?

В телефоне будет только один телефон за класс & (это все данные для одного и того же телефона, только разные цены в зависимости от сети или класса).

Что такое самая простая коллекция, которую я могу использовать для достижения цели питания в grade и network и выездной цене?

+0

Если вы собираетесь хранить все три значения вместе в объекте, то это не имеет значения; просто используйте 'List'. Если вы помещаете 'grade' и' network' в объект, то 'Dictionary ' имеет большой смысл. – BradleyDotNET

+1

Я думаю, что вы слишком задумываетесь об этом, «Список» кажется прекрасным – Jonesopolis

+0

@BradleyDotNET не забывает переопределять 'Equals' и' GetHashCode', если вы хотите, чтобы ключи имели семантику значений вместо ссылочной. –

ответ

1

Вы должны использовать типизированный список. Определение класса:

public class Phone 
{ 
    public string grade { get; set; } 
    public string network { get; set; } 
    public decimal price { get; set; } 
} 

Затем определяют список:

var list = new List<Phone>(); 

EDIT:

Per запросов, вот как запросить его.

var price = list.Where(p => p.grade = "grade" && p.network == "network").Select(p => p.price).FirstOrDefault(); 
+2

Это поможет, если вы также продемонстрируете пример того, как он может получить доступ к цене, указанной в «классе» и «сети». –

+0

@Paul Большое спасибо, вот как я добавил его в свой код. Быстрый вопрос, является ли случай с паразитами текста чувствительным? Если да, может ли это быть отключено с опцией где-нибудь? – Guerrilla

+0

Они написаны выше.Чтобы сделать нечувствительный к регистру, вы делаете следующее: if (phone.Grade.Equals ("foo", StringComparison.OrdinalIgnoreCase)) {}. Оператор LINQ выше: list.Where (p => p.grade.Equals ("foo", StringComparison.OrdinalIgnoreCase)). – Paul

1

Любой список будет выполнен, если вы используете LINQ для запроса.

List<Phone> list = ... 


string grade = "..."; 
string network = "..."; 

var phone = list.FirstOrDefault(
    p => 
     p.grade == grade && 
     p.network == network); 

if (phone != null) 
{ 
    // found one 
    var price = phone.price; 
1

Я думаю, что вы слишком задумываетесь об этом. A List<Phone> должен работать нормально.

var phones = new List<Phone>(); 

Так как вы сказали, что есть только когда одна цена для каждой комбинации grade и network вы можете использовать метод LINQ Single:

string network = string.Empty; //something useful here 
string grade = string.Empty; 
decimal price = phones.Single(p => p.network == network && p.grade == grade).price; 

Это будет сгенерировано сообщение об ошибке, если есть более чем одна комбинация те же grade и network.

+0

'Это вызовет ошибку, если имеется более одной комбинации, или не найдено ни одной комбинации. Также обратите внимание, что телефоны - это «Список », 'Single' вернет объект типа' Phone', а не 'decimal'. Вам нужно будет получить доступ к цене на этот объект. –

+0

@IlyaIvanov Да, если нет комбинации «класса» и «сети», это вызовет ошибку. Используйте «SingleOrDefault», если возможно, что ситуация возникает. Спасибо, что указали на возвращаемый тип 'Single', я забыл' .price'. –

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