Member 12237141 Ответов: 2

По крайней мере один объект должен реализовывать icomparable


Сделать исключение

По крайней мере один объект должен реализовывать IComparable

заговорщик.Дети.OfType<linegraph>().Где(x => x.описание.ToString() == (отправитель как флажок).Содержание.Метод toString()).Макс();

Что я уже пробовал:

var lineToRemove = ((отправитель как флажок).ToolTip == null) ?
заговорщик.Дети.OfType<linegraph>().Где(x => x.описание.ToString() == (отправитель как флажок).Содержание.Метод toString()).Макс() :
заговорщик.Дети.OfType<linegraph>().Где(x => x.описание.ToString() == (отправитель как флажок).Содержание.ToString() + " | " + (отправитель как флажок).ToolTip.ToString()).Max();


if (lineToRemove != null)
{
int a = плоттер.Дети.Метод indexOf(lineToRemove);
заговорщик.Дети.удалить(lineToRemove);
заговорщик.Детей.RemoveAt(а++);
}

2 Ответов

Рейтинг:
16

OriginalGriff

Проверьте свой linegraph введите, а также убедитесь, что у вас есть правильная линия.

Вы получаете эту ошибку при попытке заказать коллекцию объектов, которая не поддерживает IComparable, обычно при попытке заказать их - я не видел ее для Max, но я думаю, что это возможно.
Конечно, когда я пытаюсь приблизиться к вашему коду (а без ваших фактических классов я не могу приблизиться так близко) У меня нет никаких проблем:

private class MyClass {
    public string Desc { get; set; }
    public MyClass(string s) { Desc = s; }
    }
private void FrmMain_Shown(object sender, EventArgs e)
    {
    List<MyClass> items = new List<MyClass>() { new MyClass("one"), new MyClass("two"), new MyClass("three") };
    MyClass y = items.Where(x => x.Desc.ToString() == "two".ToString()).Max();
    }


Richard Deeming

Это странное поведение LINQ - ваш код работает, потому что входная последовательность содержит ровно один элемент. Если входная последовательность содержит более одного элемента, вы получите исключение OP.

Это понятно, потому что Max нужно сравнить предметы, чтобы понять, какой из них "самый большой". Если тип не реализован IComparable- нет никакого способа сделать это. :)

Рейтинг:
10

Richard Deeming

В последовательности есть несколько совпадающих элементов, и ваш linegraph тип не реализует IComparable, так что нет никакого способа для Max метод, чтобы узнать, какой элемент является "самым большим".

Возможно, вы намеревались использовать FirstOrDefault метод вместо этого?

var lineToRemove = ((sender as CheckBox).ToolTip == null) 
    ? plotter.Children.OfType<linegraph>().FirstOrDefault(x => x.Description.ToString() == (sender as CheckBox).Content.ToString()) 
    : plotter.Children.OfType<linegraph>().FirstOrDefault(x => x.Description.ToString() == (sender as CheckBox).Content.ToString() + " | " + (sender as CheckBox).ToolTip.ToString());
Также обратите внимание, что sender as CheckBox можете вернуться null если sender на самом деле это не так CheckBox Это приведет к тому, что NullReferenceException. Если вы уверены, что отправитель всегда является CheckBox, используйте вместо этого гипс.
var checkBox = (CheckBox)sender;

string valueToMatch = checkBox.ToolTip is null
    ? checkBox.Content.ToString()
    : string.Format("{0} | {1}", checkBox.Content, checkBox.ToolTip);

var lineToRemove = plotter.Children.OfType<linegraph>().FirstOrDefault(x => x.Description == valueToMatch);


Member 12237141

- СПАСИБО, СЭР.... Это работает на меня.