Удивительно, что Single()
должно занимать так много времени в таком маленьком списке. Я должен верить, что здесь происходит что-то еще. Вызов ps.FindAll()
может возвращать объект, который не кэширует его результаты, и вынуждает вас делать дорогой вызов некоторого ресурса на каждой итерации в Single()
.
Возможно, вы захотите использовать профилировщик, чтобы выяснить, куда уходит время, когда вы нажимаете эту строку. Я также предложил бы взглянуть на реализацию FIndAll()
, потому что она возвращает что-то необычно дорогое, чтобы перебирать.
Таким образом, после прочтения вашего кода, становится понятным, почему Single()
стоит так дорого. Класс PrincipalSearcher
использует хранилище служб каталогов в качестве хранилища для поиска. Он не кэширует эти результаты . Вот что влияет на вашу производительность.
Вы, вероятно, хотите материализовать список, используя ToList()
или ToDictionary()
, чтобы доступ к основной информации происходил локально.
Вы также можете полностью избежать такого рода кода и использовать вместо него метод FindOne()
, который позволяет вам напрямую запрашивать требуемый принципал.
Но если вы не можете использовать это, то что-то вроде этого должно работать лучше:
result.ToDictionary(u => u.SamAccountName)[usr.WEBUSER]