C#中any()的用法

  • 背景:
  • 探索流程:
  • 总结:

背景:

我们在一级考试系统维护的代码检查中,有一个地方一直有警告。
Use '.Any()' to test whether this 'IEnumerable System.Data.DataRow ' is empty or not.   

这里写图片描述

警告位置:

 #region 程金鹏 页码格式  2015年12月9日15:58:35
        /// 
        /// 页码格式
        /// 
        /// "wordinfo">题库实体
        public void PageNumberHeaderFormatH(WordQuestionEntity wordinfo, System.Data.DataTable dt)
        {
            WordQuestionRecordEntity studentrecord = new WordQuestionRecordEntity();

            DataRow[] drs_word = dt.Select("QuestionFlag='页码格式'");
            if (allRange.Sections.Count != 0)//警告位置
            {
                if (allRange.Sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text == "\r" || allRange.Sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text.Trim().ToString() == "")
                {
                    studentrecord.TimeStamp = MyInfo.TimeTamp();
                    //如果表格不存在,则判分为0
                    studentrecord.StudentID = FrmLogin.studentID;
                    studentrecord.ExamAnswer = "空答案";
                    studentrecord.Fration = "0";
                    //将答题记录送到数据库
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (drs_word.Count() == 0)
                        {
                            return;
                        }
                        if (!drs_word.Any())
                        {
                            return;
                        }
                        studentrecord.QuestionID = Convert.ToDouble(drs_word[0]["QuestionID"]);
                    }
                    WordLoadinfo.list.Add(studentrecord);

                }
                else
                {
                    studentrecord.TimeStamp = MyInfo.TimeTamp();
                    //传递考生ID进studentrecord实体
                    studentrecord.StudentID = FrmLogin.studentID;

                    //将考生答案传递给studentrecord实体
                    studentrecord.ExamAnswer = allRange.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range.Text.Trim().ToString();
                    //将试题的ID选择出来
                    if (drs_word.Count() == 0)//警告位置
                    {
                        return;
                    }

                    studentrecord.QuestionID = Convert.ToDouble(drs_word[0]["QuestionID"]);
                    //判分
                    WordLoadinfo.list.Add(gonggong.getStudentRecord(drs_word, studentrecord));

                }
            }
            else
            {
                studentrecord.TimeStamp = MyInfo.TimeTamp();
                //如果表格不存在,则判分为0
                studentrecord.StudentID = FrmLogin.studentID;
                studentrecord.ExamAnswer = "空答案";
                studentrecord.Fration = "0";
                //将答题记录送到数据库

                if (drs_word.Count() == 0)//警告位置
                {
                    return;
                }
                studentrecord.QuestionID = Convert.ToDouble(drs_word[0]["QuestionID"]);

                WordLoadinfo.list.Add(studentrecord);
            }

        }

        void IWordQuestionFlag.SwitchQuestionFlag(WordQuestionEntity wordinfo, System.Data.DataTable dt)
        {
            throw new NotImplementedException();
        }
        #endregion

在代码中,凡是需要在dtatable判断是否有数据的是否,都会提示警告。
警告百度,我们对警告位置

 if (drs_word.Count() == 0)//警告位置
{
      return;
}

进行了如下更换就不告警了:

if (!drs_word.Any())
 {
    return;
 }

对Any()用法的官方文档:
https://docs.microsoft.com/en-us/previous-versions/windows/apps/bb356089(v=vs.105)

探索流程:

1、 官网查询。大概意思就是如果有数据则返回true ,否则返回false。
2、 通过查看Any方法的源码,相信大家看了源码也能理解一二:

public static bool Any(this IEnumerable source)
    {
        if (source == null)
        {
            throw Error.ArgumentNull("source");
        }
        using (IEnumerator enumerator = source.GetEnumerator())
        {
            if (enumerator.MoveNext())
            {
                return true;
            }
        }
        return false;
    }

我们可以发现,源码的大概意思就是通过计数器的移动,从零开始移动,如果发现next后为有值,则为true,否则表示database中为空,返回false。

总结:

至于现在我们为什么要用any()来替代count的方式,我还么有弄明白。如果大家有过类似经验的可以在评论里回复。

你可能感兴趣的:(C#中any()的用法)