Список классов вопрос c # - PullRequest
1 голос
/ 27 июля 2011

У меня есть класс, содержащий много переменных, что-то вроде этого

class test
{    
  internal int x , y ;
  internal string z;
}

Я создал список этого класса list<test> c

Я хочу сделать следующее:

  1. проверить, все ли элементы списка содержат одинаковые x
  2. получить элемент списка с z = "try"

Мне нужен быстрый и быстрый способ, вместо этогоитерации по всем пунктам

Любое предложение, пожалуйста,

Ответы [ 3 ]

15 голосов
/ 27 июля 2011

LINQ to Objects - ваш друг. Для первого:

bool allSameX = list.All(t => t.x == list[0].x);

Test firstTry = list.First(t => t.z == "try");
Test firstTryOrNull = list.FirstOrDefault(t => t.z == "try");

Первое зависит от того, есть ли хотя бы одно значение, конечно. Альтернативы могут быть:

bool allSameX = !list.Select(t => t.x)
                     .Distinct()
                     .Skip(1)
                     .Any();

Другими словами, после того, как вы прошли первое отличное значение x, больше не должно быть. Одним приятным аспектом этого является то, что как только он обнаруживает второе отличное значение, он перестает смотреть - как и первая строка (версия All), конечно.

LINQ удивительно гибок и заслуживает внимательного изучения.

РЕДАКТИРОВАТЬ: Если вам нужно выполнить последний тест («найти элемент с определенным значением для z») для нескольких различных значений, вам может потребоваться словарь или поиск, например,

// If there are duplicate z values
var lookup = list.ToLookup(t => t.z);

// If z values are distinct
var dictionary = list.ToDictionary(t => t.z);

Без некоторой предварительной обработки невозможно выполнить нужные запросы без итерации по крайней мере некоторых списка.

2 голосов
/ 27 июля 2011

Вы можете использовать linq.Вот ссылка на небольшие примеры, которые помогут вам и в будущем http://msdn.microsoft.com/en-us/vcsharp/aa336746

0 голосов
/ 27 июля 2011

Вы можете реализовать собственный класс коллекции вместо списка и поместить в него смарт-символы поиска, например добавить метод AllItemsHaveSameX () и личное поле bool allItemsHaveSameX предоставить словарь, снабженный строками поиска, с индексом элемента, имеющего это значение.

При добавлении / удалении элементов: Вы бы переоценили allItemsHaveSameX Добавить / удалить из вашего личного словаря.

...