如何转换列表中的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" 作为日期排序(假设它始终包含可解析的日期)。
我需要将 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" 作为日期排序(假设它始终包含可解析的日期)。