Не удается проверить, содержит ли список элемент выбора в С#

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

        //Fill with all the install locations
        foreach (App y in applications)
        {
            //Check if the app has a server listed
            if (y.Server != "")
            {
                SelectListItem ItemToAdd = new SelectListItem { Text = y.Server, Value = y.Server };
                //Check if the the item has already been added to the list
                if (!vm_modal.serverLocations.Contains(ItemToAdd))
                {
                    vm_modal.serverLocations.Add(ItemToAdd);
                }
            }
        }

Однако это не работает, так как просто добавляет все, поэтому есть много дубликатов. Я не знаю, работает ли contains по-другому, потому что я имею дело не только с обычными строками или чем-то в этом роде.


person user3407039    schedule 23.03.2015    source источник
comment
Вам придется переопределить методы object.Equals и object HashCode, чтобы это работало.   -  person xlecoustillier    schedule 23.03.2015
comment
Спасибо. Я не был уверен, как это сделать, поэтому я создал еще один список строк, в котором хранится значение списка выбора, и использовал его для сравнения, и это работает. Хотя, наверное, это не самый эффективный способ.   -  person user3407039    schedule 23.03.2015
comment
stackoverflow.com/questions/ 29146355/ актуально   -  person Ahmad    schedule 23.03.2015


Ответы (2)


В этом случае, поскольку вы используете одну и ту же строку для Text и Value, вы можете выполнить итерацию по своему источнику и добавить неповторяющиеся значения в простой List<string> перед добавлением всех проверенных значений в список выбора.

List<string> result = new List<string>();

foreach (App y in applications)
{
    //Check if the app has a server listed and for duplicates
    if (y.Server != "" && !result.Contains(y.Server))
    {
            result.Add(y.Server);
    }
}

result.ForEach(x => vm_modal.serverLocations.Add(
                new SelectListItem(){Text = x, Value = x}));
person ste-fu    schedule 23.03.2015

для "одного вкладыша" того, что представлено ste-fu, вы можете написать

vm_modal.serverLocations
    .AddRange(applications
               .Where(app => app.Server != "")
               .Select(app => app.Server)
               .Distinct()
               .Select(server => new SelectListItem{ Text = server, Value = server }));
person Default    schedule 23.03.2015