Скопировать перечисляемый в список?"Невозможно неявно преобразовать тип 'MyClass.Items' в 'System.Collections.Generic.List«» - PullRequest
2 голосов
/ 13 января 2012

Это нубский вопрос.Поэтому, если я неверно сформулировал вопрос, это потому, что я не до конца понимаю, что происходит.

Issue

Ошибка компиляции: невозможно неявное преобразование типа 'MyClass.Элементы 'to' System.Collections.Generic.List '

Context

Я перебираю List через IOrderedEnumerable, но яЯ не могу вернуть нужную запись, потому что она имеет тип List (так как все мое приложение передает List объекты туда и обратно).

Мой метод ввода - List, но онкажется, что неявно приводится к IEnumerable, когда я использую опцию OrderBy.

Я прочитал все, что нашел, но все это сводится к:

// ToList is not available!
return SingleItemToCheck.ToList;

или

// same type conversion error
List<Items> ReturningList = SingleItemToCheck;

Код проблемы

public static List<Items> FindCheapestItem(List<Items> source)
{
    // Now we pop only the first one. 
    // ISSUE: Sometimes the top entry on the list is bad, 
    //        so we need to check it!
    var BestItemCandidate = source.OrderBy(s => s.ItemDesirability);
    bool ForgetThisOne = false;

    foreach (var SingleItemToCheck in BestItemCandidate)
    {
        ForgetThisOne = false;

        // ... test for ItemDesirability, truncated
        if (Desirability < 0)
        {
            ForgetThisOne = true;
        }

        if (!ForgetThisOne)
        {
            // we are just returning the first desirable row
            // because we are sorted on desirability
            // and consuming code can only digest a single item.
            return SingleItemToCheck;  // !!! ARGH, compile error !!!
        }
    }

    // means we looped through everything and found nothing of interest
    return null;
}

1 Ответ

4 голосов
/ 13 января 2012

SingleItemToCheck - это отдельный элемент, это не список.У него нет метода ToList().Просто создайте список с этим единственным элементом.

return new List<Items> { SingleItemToCheck };

Или, если вас интересует только один элемент, измените тип возвращаемого значения метода просто на Items и полностью опустите список.

Еще один способ написать это, особенно если вас интересует только один элемент, - просто реорганизовать логику внутреннего цикла в функцию, а затем написать запрос

return source
         .OrderBy(s => s.ItemDesirability)
         .Where(s => IsDesirable(s)) // refactored loop logic, returning boolean
         .FirstOrDefault(); // first desirable item, or null

В противном случае,если вам абсолютно необходим список, но в нем только один элемент, рассмотрите

 var list =  source
         .OrderBy(s => s.ItemDesirability)
         .Where(s => IsDesirable(s))
         .Take(1)
         .ToList();

Если элементы не пропущены, это будет пустой список.Затем вы можете выбрать возврат null, как это делает ваш текущий код, или вернуть пустой список и позволить вызывающим абонентам справиться с этим вместо результата null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...