[英]How to check if a List<T> Index is null
我有一種方法可以從數據庫中計算出每個月的總金額,如圖所示。
public static List<Sale> ChartMonthlySalePerYear()
{
using (SQLiteConnection con = new SQLiteConnection(Connection.DatabaseLocationString))
{
SQLiteCommand cmd = null;
string query = String.Format("SELECT strftime('%m', SaleDate) AS month, SUM(AmountPaid) AS sum_amountpaid FROM {0} WHERE strftime('%Y', SaleDate) = @1 GROUP BY strftime('%m', SaleDate) ", Sale.TABLE_NAME);
cmd = new SQLiteCommand(query, con);
cmd.Parameters.Add(new SQLiteParameter("@1", Properties.Settings.Default.ChartYearlyDisplay));
con.Open();
SQLiteDataReader reader = cmd.ExecuteReader();
var list = new List<Sale>();
while (reader.Read())
{
Sale value = new Sale()
{
Months = reader["month"].ToString(),
SUMAmountPaid = Convert.ToDecimal(reader["sum_amountpaid"])
};
list.Add(value);
}
con.Close();
return list;
}
}
然后按月返回這樣的列表,
這就是使用方法的地方。
List<Sale> sum = SaleViewModel.ChartMonthlySalePerYear();
Jan = sum[0].SUMAmountPaid;
Feb = sum[1].SUMAmountPaid;
Mar = sum[2].SUMAmountPaid;
Apr = sum[3].SUMAmountPaid;
May = sum[4].SUMAmountPaid;
Jun = sum[5].SUMAmountPaid;
Jul = sum[6].SUMAmountPaid;
//For Ausgust
if (sum[7] != null)
Aug = 0;
else
Aug = sum[7].SUMAmountPaid;
//For September
if (sum[7] != null)
Sep = 0;
else
Sep = sum[7].SUMAmountPaid;
我現在的挑戰是,Aug&Sep沒有值,我想先檢查一下之后再賦予默認值,但是會拋出異常。 Index was out of range. Must be non-negative and less than the size of the collection.
對於八月和九月。在此先感謝。
您想要在訪問該索引之前檢查索引是否小於或等於列表的長度,以避免索引超出范圍的異常:
if (sum.Count <= 7)
Aug = 0;
else
Aug = sum[7].SUMAmountPaid;
但這不會像您期望的那樣工作,如果您的數據有漏洞。 如果您的數據確實有空洞,則列表的索引將與月份不匹配。 如果是這種情況,請考慮使用Dictionary<int, Sale>()
:
var salesByMonth = new Dictionary<int, Sale>();
while (reader.Read())
{
Sale value = new Sale()
{
Months = reader["month"].ToString(),
SUMAmountPaid = Convert.ToDecimal(reader["sum_amountpaid"])
};
salesByMonth.Add(int.Parse(value.Months), value);
}
和
Sale value;
if (salesByMonth.TryGetValue(1, out value))
Jan = value.SUMAmountPaid;
else
Jan = 0;
if (salesByMonth.TryGetValue(2, out value))
Feb = value.SUMAmountPaid;
else
Feb = 0;
您不應該為此使用索引方法,因為您的Sale
類型具有一個Months
屬性,並使用reader["month"]
值填充。 您可以使用謂詞( Func<Sale, bool>
委托)確定一個月是否存在。
使用Linq,可以將謂詞與First
或FirstOrDefault
一起使用,以返回評估為true
的第一個實例。
List<Sale> sum = SaleViewModel.ChartMonthlySalePerYear();
Jan = sum.Where((item) => item.Months == 1).Select((item) => item.SUMAmountPaid).DefaultIfEmpty(0).First();
Feb = sum.Where((item) => item.Months == 2).Select((item) => item.SUMAmountPaid).DefaultIfEmpty(0).First();
Mar = sum.Where((item) => item.Months == 3).Select((item) => item.SUMAmountPaid).DefaultIfEmpty(0).First();
Mar = sum.Where((item) => item.Months == 4).Select((item) => item.SUMAmountPaid).DefaultIfEmpty(0).First();
要么,
Jan = sum.Any((item) => item.Months == 1) ? sum.First((item) => item.Months == 1).SUMAmountPaid : 0;
Feb = sum.Any((item) => item.Months == 2) ? sum.First((item) => item.Months == 2).SUMAmountPaid : 0;
Mar = sum.Any((item) => item.Months == 3) ? sum.First((item) => item.Months == 3).SUMAmountPaid : 0;
Apr = sum.Any((item) => item.Months == 4) ? sum.First((item) => item.Months == 4).SUMAmountPaid : 0;
您只需.ForEach
即可遍歷您的記錄和一個切換案例以映射它們。
List<Sale> sum = SaleViewModel.ChartMonthlySalePerYear()
.ForEach((item) => {
switch(item.Months)
{
case 1:
Jan = item.SUMAmountPaid;
break;
case 2:
Feb = item.SUMAmountPaid;
break;
case 3:
Mar = item.SUMAmountPaid;
break;
case 4:
Apr = item.SUMAmountPaid;
break;
case 5:
May = item.SUMAmountPaid;
break;
case 6:
Jun = item.SUMAmountPaid;
break;
case 7:
Jul = item.SUMAmountPaid;
break;
case 8:
Aug = item.SUMAmountPaid;
break;
case 9:
Sept = item.SUMAmountPaid;
break;
case 10:
Oct = item.SUMAmountPaid;
break;
case 11:
Nov = item.SUMAmountPaid;
break;
case 12:
Dec = item.SUMAmountPaid;
break;
default: //do nothing
break;
}
});
確保默認情況下, Jan
到Dec
為0
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.