2014-11-03 3 views
4

Я пишу код, который выберет строковые ключи из массива ApiIds, которые не являются собственностью ApiId из объектов результатов.Выберите String, который не является свойством другого объекта

Я написал следующий код, но он выглядит излишним для меня, есть ли способ объединить это в один оператор и не преобразовать HashSet объектов в другой HashSet строк?

 var resultsCached = new HashSet<string>(results.Select(x => x.ApiId)); 
     var missingResults = apiIds.Select(x => !resultsCached.Contains(x)); 

Спасибо.

+4

этот способ выглядит разумным для меня. почему вы хотите его изменить? –

+0

Короче не обязательно лучше ... особенно в тех случаях, когда любая магия за коротким кодом не совсем понятна .. (а не только оригинальный автор, но и любой, кто будет читать и поддерживать этот код позже). Примером может быть, в зависимости от того, что означает ilya, и не конвертировать HashSet объектов в другой HashSet строк? " ответы с использованием «Исключить» ниже, могут быть или не быть подходящими. –

ответ

8

Except даст вам элементы, которые не входят в другой коллекции:

var missingResults = apiIds.Except(results.Select(x => x.ApiId)); 
1

Другой эффективный O (п) подход заключается в использовании HashSet.ExceptWith, который удаляет все элементы из множества, которые во второй последовательности :

HashSet<string> apiIdSet = new HashSet<string>(apiIds); 
apiIdSet.ExceptWith(results.Select(x => x.ApiId)); 

набор содержит только строки, которые не находятся в results прямо сейчас.

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

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