异常排序c#

异常排序c#,c#,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();

当它到达最后一行时,我的代码就在“索引超出范围”以下。 有人能帮我找出问题所在吗

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();

    }
}
List mailInfoList=newlist();
如果(ds.Tables[0].Rows.Count>0)
{
foreach(ds.Tables[0].行中的DataRow行)
{
string strSubject=row[“Subject”].ToString();
字符串strEmailFrom=row[“EmailFrom”].ToString();
字符串strEmailTo=row[“EmailTo”].ToString();
字符串strEmailCC=row[“EmailCc”].ToString();
string strEmailContent=行[“EmailContent”]。ToString();
字符串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();
}
}

这里。试着做一件事:

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();

    }
}
var mailInfoList=newlist();
如果(ds.Tables[0].Rows.Count>0)
{
foreach(ds.Tables[0].行中的DataRow行)
{
string strSubject=row[“Subject”].ToString();
字符串strEmailFrom=row[“EmailFrom”].ToString();
字符串strEmailTo=row[“EmailTo”].ToString();
字符串strEmailCC=row[“EmailCc”].ToString();
string strEmailContent=行[“EmailContent”]。ToString();
//在这里做正确的错误处理
DateTime strCreatedOn=DateTime.Parse(行[“CreatedOn”].ToString());
添加(新元组)(
strSubject,strEmailFrom,strEmailTo,strEmailCC,strEmailContent,strCreatedOn
));
var newList=mailInfoList.OrderBy(x=>x.Item1).ThenBy(x=>x.Item6.ToList();
}
}

它将按主题对项目进行排序,然后按创建日期进行排序。只需确保
DateTime.Parse
不会抛出错误(您也可以使用
DateTime.TryParse

请注意,当您使用
OrderBy(x=>x[1])
x引用
mailInfoList
类型为
字符串的每个索引,x[1]引用该索引的第二个字符

那么您确定列表的每个索引的长度至少为1吗

我建议您使用:

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

首先,你需要创建一个类模型,它类似于数据表对象,从你的例子来看,它是这样的

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);
}
List mailInfoList=newlist();
如果(ds.Tables[0].Rows.Count>0)
{
foreach(ds.Tables[0].行中的DataRow行)
{
电子邮件=新电子邮件();
email.Subject=行[“Subject”].ToString();
email.EmailFrom=行[“EmailFrom”].ToString();
email.EmailTo=行[“EmailTo”].ToString();
email.EmailCc=行[“EmailCc”].ToString();
email.EmailContent=行[“EmailContent”].ToString();
email.CreatedOn=Convert.ToDateTime(第[“CreatedOn”].ToString()行);
mailInfoList.Add(电子邮件);
}
var newList=mailInfoList.OrderBy(c=>c.EmailFrom).ThenBy(n=>n.CreatedOn);
}

你到底想做什么?因为你似乎想根据第二个然后第三个字符对列表进行排序,但似乎列表中的每个字符串都至少有2或3个字符长。好的..我这里做错了..我的目标是读取数据表中的所有值,并根据主题和createdon进行排序..我需要传递e sortedlist做一些处理..请帮助我..我对此没有太多想法.谢谢.非常感谢..会尝试很多..这解决了我的排序问题.我需要在排序中再做一件事.数据表中的第1行[主题]列“ABC/Vess/11371503/C报告”数据表中的第2行[主题]列“Value/BEY/11371503/a报告”我需要根据/比较主题列中的值,如果/之前的值相同,我应该在下一个斜杠和排序之前查找下一个值。有什么建议可以实现这一点吗。谢谢。很高兴这有帮助。如果它解决了这个特殊问题,那么请。至于你的第二个问题,你想删除空格吗?我想拆分基于“/”的值并比较这些值。我的目的是根据主题列中的值对行进行排序……例如,如果第二个斜杠后的值与两行相同,我需要检查第三个斜杠后的值,并制作一份报告以进行排序。@Priya您可以根据
/
行[“subject”]这样进行拆分:
行[“subject”]。ToString().Split(新[]{'/},StringSplitOptions.RemoveEmptyEntries)
。它将返回一个字符串数组,您可以进行比较。如果有更多详细信息或要求,请随时提出新问题。