如何转换列表中的var?

How to convert var in List?

我需要将 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 语句时出现异常。

要么在你的结构上实现 IComparable,要么你的 lambda 顺序有误:

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

你可以用.ToList() cal跟随它得到List<myStruct> orderedList2


有效:

我建议将您的结构设为 class(在当前 class 之外删除它)并像这样实现 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);
    }
}

您需要实例化列表:

List<myStruct> myList;

应该是

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

如果没有这个,我相信 myList 将是空的。因此空引用异常。

在您的代码中:

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

您返回 "x",这是一个 myStruct。而且您忽略了刚刚解析的 dt (也没有检查是否成功)。

因此,为了快速修复这部分,只需 return dt; 按 "delivery" 作为日期排序(假设它始终包含可解析的日期)。