ienumerable‹string› для списка‹string›

У меня есть следующий фрагмент кода

        string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);  
        //convert the array into a list for easier comparison
        List<string> StringtoList = lines.OfType<string>().ToList();

        //get the database list here
        List<string> sensitiveApps = testConnection.SelectSensitive();

        //compare the 2 lists to get the difference
        List<string> except = sensitiveApps.Except(StringtoList,StringComparer.OrdinalIgnoreCase);

Тем не менее, я продолжаю получать вышеуказанную ошибку, может ли кто-нибудь указать мне правильное направление?


person David Ten    schedule 20.01.2013    source источник
comment


Ответы (2)


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

List<string> except = sensitiveApps.Except(StringtoList,StringComparer.OrdinalIgnoreCase);

to:

List<string> except = sensitiveApps.Except(StringtoList,StringComparer.OrdinalIgnoreCase).ToList();

Это исключение возникает, поскольку Except будет возвращать IEnumerable<string>.

person Daniel Kelley    schedule 20.01.2013
comment
Этот ответ правильный, но на самом деле я бы пошел наоборот (изменил тип, кроме IEnumerable, или, что еще лучше, просто на «var» и забыл об этом), что способствовало бы слабой связи - person Benjamin Gruenbaum; 20.01.2013
comment
Я думаю, все зависит от того, действительно ли ему нужен список или перечисляемое. Недостаточно кода, чтобы судить в любом случае. - person Daniel Kelley; 20.01.2013
comment
Спасибо теперь работает! Я относительно новичок в C #, кодировал на Java в течение 3 лет в школе. Мне есть чему поучиться, но еще раз спасибо! - person David Ten; 20.01.2013

Хотя предложение Даниэля, безусловно, правильное, я хотел бы предложить альтернативу: использовать HashSet<string>, который лучше разработан для операций на основе наборов, таких как Except.

var set = new HashSet<string>(sensitiveApps, StringComparer.OrdinalIgnoreCase);
set.ExceptWith(lines);

Нет необходимости делать lines.OfType<string>().ToList(), так как строки IEnumerable<string>. Затем, если вам нужен результирующий набор в виде списка, просто вызовите set.ToList().

Надеюсь это поможет!

Изменить: предполагается, что порядок чувствительных приложений не имеет значения.

person Paul    schedule 20.01.2013