Как конвертировать переменную в List? - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно преобразовать var в тип List<myStruct>.Мне пришлось использовать var, чтобы заказать список myStruct, и я получил orderedList2, но теперь мне нужно перебрать этот список, и я не знаю, как это сделать.

public struct myStruct
{

    public String delivery;
    public String articleCode;
    public String dex;
    public String phase;
    public String quantity;

};

List<myStruct> myList;

var orderedList2 = myList.OrderByDescending(x =>
    {
        DateTime dt;
        DateTime.TryParse(x.delivery, out dt);
        return x;
    });

// now I have to fill the ListView again
foreach(myStruct str in orderedList2)
{
    string[] s = new string[5];
    s[0] = str.delivery;
    s[1] = str.articleCode;
    s[2] = str.dex;
    s[3] = str.phase;
    s[4] = str.quantity;

    ListViewItem itl = new ListViewItem(s);
    ////String s = r["DEXART"].ToString();
    ////MessageBox.Show(s);
    listView1.Items.Add(itl);
}

Когда код достигает оператора foreach, я получаю исключение.

Ответы [ 4 ]

5 голосов
/ 20 сентября 2019

Либо внедрите IComparable в своей структуре, либо у вас есть ошибка в вашем лямбда-ордере:

 var orderedList2 = myList.OrderByDescending(x =>
    {
        DateTime dt;
       if( DateTime.TryParse(x.delivery, out dt))
           return dt;
        return DateTime.MinValue;
    });

вы можете использовать .ToList() cal для получения List<myStruct> orderedList2.


работает:

enter image description here

1 голос
/ 20 сентября 2019

Я бы предложил сделать вашу структуру классом (исключить его за пределы вашего текущего класса) и реализовать IComparable примерно так:

public class myClass : IComparable
{
    public String delivery;
    public String articleCode;
    public String dex;
    public String phase;
    public String quantity;

    // Order by delivery datetime
    public int CompareTo(object obj)
    {
        if (obj.GetType() != typeof(myClass ) || (obj.delivery == delivery))
            return 0;

        DateTime dtDelivery = DateTime.ParseExact(delivery, "dd-MM-yyyy");
        DateTime dtObjDelivery = DateTime.ParseExact((obj as myClass).delivery, "dd-MM-yyyy");
        return dt.Delivery.CompareTo(dtObjDelivery);
    }
}
0 голосов
/ 20 сентября 2019

В вашем коде:

var orderedList2 = myList.OrderByDescending(x =>
    {
        DateTime dt;
        DateTime.TryParse(x.delivery, out dt);
        return x;
    });

вы возвращаете "x", то есть myStruct.И вы игнорируете dt, который вы только что проанализировали (не проверяя, также успешно ли это).

Так что для быстрого исправления этой части, просто return dt;, чтобы заказать по "доставке" как дате (при условии, что она всегда содержит анализируемую дату).

0 голосов
/ 20 сентября 2019

Вам нужно создать экземпляр списка так:

List<myStruct> myList;

Должно быть

List<myStruct> myList = new List<myStruct>;

Без этого я верю, что myList будет нулевым.Отсюда исключение нулевой ссылки.

...