2016-10-19 3 views
0

У меня здесь двойная проблема. Мне нужно отсортировать список <>, который я знаю, содержит объекты производного класса для класса, который был объявлен как содержащий список изначально. И, мне нужно отсортировать по возвращаемому значению из метода в этом производном классе, который принимает параметр. Имейте в виду, что я уже знаю, что List содержит объекты всех типов производного класса.Как отсортировать список <>, содержащий объекты производного класса, методом производного класса

Я создал образец кода здесь, чтобы продемонстрировать этот вопрос, поскольку реальный код нельзя публиковать публично. Обратите внимание: я не контролирую базовые условия здесь (то есть тот факт, что объявленное содержимое коллекции List List - это родительский класс и содержит объекты производного класса, который содержит метод, который принимает аргумент и возвращает значения, которые Мне нужно отсортировать коллекцию). Поэтому я сомневаюсь, что смогу использовать любое предложение, требующее изменений там. Мне кажется, что мне нужно указать (cast?) То, что действительно находится в списке, чтобы я мог получить доступ к методу, определенному там. Но я уверен в других мыслях. В противном случае у меня останется традиционный пузырь. Благодарю.

public class Component 
{ 
    public int X; 
    public int Y; 
} 

public class ComponentList : List<Component> 
{ 
    // Other members that deal with Components, generically 
} 


public class Fence : Component 
{ 
    public int Distance(int FromX, int FromY) 
    { 
    int returnValue = 0; 
    // Caluclate distance... 
    return returnValue; 
    } 
} 

public class Yard : Component 
{ 
    // Yada yada yada 
} 

public class MyCode 
{ 
    public List<Component> MyFences; 

    public MyCode(List<Component> Fences, int FromX, int FromY) 
    { 
    // Sort the fences by their distance from specified X,Y 
    Fences.Sort((A as Fence, B as Fence) => A.Distance(FromX, FromY).CompareTo(B.Distance(FromX, FromY))); 

    // Or 
    List<Fence> sortedFences = MyFences.OrderBy(A => A.Distance(FromX, FromY)).ToList(); 

    // Or ??? 
    } 
} 
+0

Что не так с литьем? Или вы просто не знаете синтаксис листинга - https://msdn.microsoft.com/en-us/library/ms173105.aspx)? –

+1

Что происходит, когда 'Fences' действительно содержит объект, который не является забором? – Rob

ответ

2

Используйте метод Enumerable.Cast<Fence> расширения для преобразования IEnumerable<Component> в IEnumerable<Fence>. Тогда я бы использовал ваш второй подход (подход OrderBy), чтобы отсортировать его, но это мое предпочтение.

List<Fence> sortedFences = MyFences.Cast<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList(); 

Этот подход будет метать, если в MyFences есть объект, который нельзя отбросить на забор. Если вы ожидаете, что код должен быть передан только заборам, это может быть то, что вы хотите. Если вместо этого вы хотите пропустить участников без забора, вы можете использовать:

List<Fence> sortedFences = MyFences.OfType<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList(); 
+0

Это был кастинг, который мне нужен. БЛАГОДАРЯ! Я думал, что мне нужен какой-то кастинг, но просто не знал этого. И вот это ... красивая вещь. – PilotMelch

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