2015-10-25 29 views
-1

當下面的代碼到達最後一行時,我得到下面的「索引超出範圍」。 任何人都可以幫助這個找出什麼是錯的異常排序c#

List<string> mailInfoList = new List<string>(); 
if (ds.Tables[0].Rows.Count > 0) 
{ 
    foreach (DataRow row in ds.Tables[0].Rows) 
    { 

     string strSubject = row["Subject"].ToString(); 
     string strEmailFrom =row["EmailFrom"].ToString(); 
     string strEmailTo =row["EmailTo"].ToString(); 
     string strEmailCC =row["EmailCc"].ToString(); 
     string strEmailContent=row["EmailContent"].ToString(); 
     string strCreatedOn =row["CreatedOn"].ToString(); 

     mailInfoList.Add(strSubject); 
     mailInfoList.Add(strEmailFrom); 
     mailInfoList.Add(strEmailTo); 
     mailInfoList.Add(strEmailCC); 
     mailInfoList.Add(strEmailContent); 
     mailInfoList.Add(strCreatedOn); 
     var newList = mailInfoList.OrderBy(x => x[1]).ThenBy(x => x[2]).ToList(); 

    } 
} 
+4

你到底要做什麼?因爲它看起來像是在根據第二和第三個字符對列表進行排序,但似乎並非列表中的每個字符串都至少有2或3個字符。 – Nasreddine

+0

ok ..im在這裏做錯了..我的目標是讀取數據表中的所有值,並根據主題進行排序並createdon..I需要通過排序列表做一些處理..請幫助我..我沒有對此很有想法。謝謝。 – Priya

回答

0

這裏。嘗試改爲:

var mailInfoList = new List<Tuple<string, string, string, string, string, DateTime>>(); 
if (ds.Tables[0].Rows.Count > 0) 
{ 
    foreach (DataRow row in ds.Tables[0].Rows) 
    { 

     string strSubject = row["Subject"].ToString(); 
     string strEmailFrom = row["EmailFrom"].ToString(); 
     string strEmailTo = row["EmailTo"].ToString(); 
     string strEmailCC = row["EmailCc"].ToString(); 
     string strEmailContent = row["EmailContent"].ToString(); 
     // Do proper error handling here 
     DateTime strCreatedOn = DateTime.Parse(row["CreatedOn"].ToString()); 

     mailInfoList.Add(new Tuple<string, string, string, string, string, DateTime>(
      strSubject, strEmailFrom, strEmailTo, strEmailCC, strEmailContent, strCreatedOn 
      )); 

     var newList = mailInfoList.OrderBy(x => x.Item1).ThenBy(x => x.Item6).ToList(); 

    } 
} 

它會根據主題按創建日期排序項目。只要確保DateTime.Parse不拋出錯誤(你也可以使用DateTime.TryParse

+0

非常感謝..將嘗試 – Priya

+0

非常感謝..這解決了我的排序問題。我需要在排序中做更多的事情。 行1 [主題]列中的數據表「ABC /娜維斯/ 11371503/C報告」 行2 [主題]列dtatable「值/ BEY/11371503/A報告」我需要基於主題列內的值,以比較/如果/之前的值相同,我應該在下一個斜槓之前查找下一個值並進行排序。是否有任何建議可以實現此目的。謝謝。 – Priya

+0

很高興幫助。如果它解決了這個問題,那麼請[標記爲答案](http://meta.stackexchange.com/a/5235/)。至於你的第二個問題,你想刪除空格? – Nasreddine

0

請注意,當你使用OrderBy(x => x[1])X指的mailInfoList每個索引類型的String,和X [1]參考,以第二個字符。這個指數

那麼你肯定列表的各項指標都有最低一長度爲1

我建議你使用:

var newList = mailInfoList.where(y => y.lenght > 0).OrderBy(x => x[1]).ThenBy(x => x[2]).ToList(); 
0

首先,你需要創建類模型,類似於表對象的數據,從你的榜樣它看起來像這樣,

public class Emails 
{ 
    public string Subject { get; set; } 
    public string EmailFrom { get; set; } 
    public string EmailTo { get; set; } 
    public string EmailCc { get; set; } 
    public string EmailContent { get; set; } 
    public DateTime CreatedOn { get; set; } 
} 

和你的更新代碼塊變爲,

List<Emails> mailInfoList = new List<Emails>(); 
if (ds.Tables[0].Rows.Count > 0) 
{ 
    foreach (DataRow row in ds.Tables[0].Rows) 
    { 
     Emails email = new Emails(); 
     email.Subject = row["Subject"].ToString(); 
     email.EmailFrom = row["EmailFrom"].ToString(); 
     email.EmailTo = row["EmailTo"].ToString(); 
     email.EmailCc = row["EmailCc"].ToString(); 
     email.EmailContent = row["EmailContent"].ToString(); 
     email.CreatedOn = Convert.ToDateTime(row["CreatedOn"].ToString()); 
     mailInfoList.Add(email); 
    } 
    var newList = mailInfoList.OrderBy(c => c.EmailFrom).ThenBy(n => n.CreatedOn); 
}