2014-02-13 5 views
3

Я относительно новичок в программировании на C# (программирование в целом, на самом деле), но я создал приложение для управления пулами приложений на сервере, который использует моя команда на работе. Он делает все, что должно быть достаточно хорошо, но единственная проблема, с которой я столкнулся, заключается в сохранении ранее использованных конфигураций в файле app.config, чтобы пользователю не приходилось вручную вводить их вручную. Как бы то ни было, я могу сохранить и загрузить из файла великолепно (вместе со всеми строками, которые мне нужны в каждой группе).Как проверить, существует ли значение в списке?

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

<appSettings> 
<add Name="RowName" MachineName="MS-02348" AppSrvName="AppServer" WebSrvName="AppNet"/> 
<add Name="RowName2" MachineName="MS-68186" AppSrvName="AppServer2" WebSrvName="AppNet2"/> 
</appSettings> 

Так что я сейчас делаю, чтобы загрузить значения, у меня есть метод, который получает AppSettings/добавить узлы и бросает их в список, а затем устанавливает значениям свойств объекта. Причина, по которой я делаю это, заключается в том, что у меня может быть раскрывающийся список, в котором указано только имя объекта, а затем вся остальная информация доступна, когда я вызываю метод на выбранном элементе.

Как бы то ни было, я хочу убедиться, что если имя уже существует в app.config, я предлагаю пользователю записать другое имя вместо сохранения его в базу данных. Наличие двух дочерних узлов с тем же значением «Имя» может привести к хаосу моей логики.

Я пробовал использовать foreach для перемещения по объектам в списке, но, не зная, сколько объектов там может быть, я не знал простого способа сказать, что он существует или не существует. Я также попытался настроить таргетинг на childnode на основе значений, перечисленных в узле, но, похоже, тоже не работает. Я предполагаю, что эта часть является синтаксисом, но, похоже, она соответствует тому, как ее определяет список методов.

Любые мысли?

+2

Здравствуйте, добро пожаловать на сайт! Пара вещей: в вашем примере кода отсутствует заключительная цитата по одному из атрибутов «MachineName»; и вы должны, вероятно, включить свой фактический код C#, который обрабатывает список, и подробно расскажите о конкретных проблемах, которые у вас есть. – admdrew

+0

', но не зная, сколько объектов там может быть, я не знал ...' - Что вы подразумеваете под этим? Почему это важно? – ispiro

+0

Спасибо за редактирование. Я не копировал и не вставлял, поэтому, должно быть, пропустил эту цитату! Я не добавлял никакого кода, потому что ничто из этого не делает то, что мне нужно ... это не так много, что он не будет компилироваться или исключений, но я не могу придумать логический способ заставить его работать. То, что я делал, является foreach, а затем сравнивает каждый результат, чтобы узнать, является ли MachineName! = Null (MachineName является произвольным ... просто убедившись, что ничего не возвращается). Проблема в том, что он вернется с ошибкой 3 раза и один раз. В моей ситуации я хочу убедиться, что все * вернулось назад. – hotleadsingerguy

ответ

7
if (list.Any()) 
{ 
    // found something! 
} 
else 
{ 
    // found nothing 
} 

Я всегда использую Any() просто потому, что это самый производительный. List.Count() проходит через каждый элемент и подсчитывает их, но вас не интересует количество предметов - вам все равно, если есть предмет вообще.Any() перечислит список и остановится, если найдет элемент. Итак, в крайнем случае, в списке из миллиона предметов Count() будет перечислять каждый из них и возвращаться, а Any() перечислит один и вернется.

Плюс, он возвращает bool, что удобно для более сжатого кода. :)

В качестве дополнительного бонуса вы можете позвонить Any(), ища конкретные вещи. Таким образом, в списке людей, я могу посмотреть, чтобы увидеть, если есть какие-то люди старше 21 в нем:

if (list.Any(person => person.Age > 21)) 
{ 
    // ... 
} 

Edit: Форматирование.

+0

Вот и все! Основной код, который я использовал, следующий: ConnectionInfo.GetConnectionInfos() - это моя методология создания списка. 'если (ConnectionInfo.GetConnectionInfos(). Любая (информация => info.Name == textBox4.Text)) { // Пожаловаться, что один существует }' textBox4 является одним из полей ввода, которые добавляются к списку. Это сделал трюк! Спасибо всем за потрясающие предложения! – hotleadsingerguy

4

может быть что-то вроде этого

 var list = new List<AppSettings>(); 
     var item = list.FirstOrDefault(x => x.Name == NameEnteredByUser); 
     if (item == null) 
     { 
      //there is no such item 
     } 
     else 
     { 
      //notify the user 
     } 

или метода Любого расширения:

var list = new List<AppSettings>(); 
     if (list.Any(x => x.Name == NameEnteredByUser)) 
     { 
      //name exists 
     } 
     else 
     { 
      //no such name used before 
     } 

Как Замечание, имеет уникальное поле, настроенное в базе данных, так что, когда ваша логика программирования терпит неудачу вы не вводить запись. поврежденное состояние данных в db плохо.

+2

Я думаю, вам нужно использовать 'FirstOrDefault' вместо' First'. – kaptan

+0

нет в этом случае, потому что im проверка vs null. firstordefault возвращает объект из базового конструктора, если ни один элемент не найден не null. в этом случае получение нулевого значения показывает, что элемент не найден. – neo112

+0

В соответствии с MSDN (http://msdn.microsoft.com/library/bb535050(v=vs.110).aspx) Сначала будет выбрано 'InvalidOperationException', если нет соответствующих элементов – JleruOHeP

0

neo112 верен в своей логике, но я не уверен, что основная проблема, с которой вы столкнулись, связана с производительностью, поскольку вы упоминаете, что не знаете, может ли она затянуться слишком долго.

Во-первых, вы также можете сделать следующее;

int count = list.Count(a => a.Name == NameEnteredByUser); 
if(count > 0) 
{ 
    // exists 
} 

Я считаю .Count() быстрее, чем .Первый() (неподтвержденная только), и лично думаю, что это немного чище.

Кроме того, вы можете попытаться сортировать свой список по имени при добавлении в узел appSettings. Затем вы должны создать экземпляр SortedList, а не только List, то это также повлияет на производительность. Но я не уверен, что сортировка - это вариант для вас.

+2

Использование list.Any было бы быстрее, чем list.Count –

+0

list.Count() - это O (n), list.Any - наихудший случай O (n), поэтому вы не выиграете в производительности – neo112

+0

@ DarrenYoung хороший момент, я всегда забываю о .Any(). Он также чище. –

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