簡體   English   中英

如何檢查清單 <T> 索引為空

[英]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;

        }
    }

然后按月返回這樣的列表,

  • 01 20000.00(例如一月)
  • 02 13000.00(例如2月)
  • 03 10000.00(例如3月)
  • 04 10000.00(例如,四月)
  • 05 10000.00(例如,五月)
  • 06 20000.00(例如,六月)
  • 07 15000.00(例如7月),但其他月份則沒有銷售。

這就是使用方法的地方。

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,可以將謂詞與FirstFirstOrDefault一起使用,以返回評估為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;
        }
    });

確保默認情況下, JanDec0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM