【问题标题】:IEnumerable concepts - Get All and Get OneIEnumerable 概念 - 得到所有和得到一个
【发布时间】:2019-07-12 20:56:53
【问题描述】:

我有一个具有 IEnumerable 的函数,它将循环创建一个字符串的记录列表。当我只返回一个对象时,我也想使用相同的函数。在中间层有两个函数,一个返回列表,另一个返回对象。

我是否必须构建一个接收对象的新函数?

          public List<Model.Disease> GetDisease()
            {
             var Disease = (from Diseases in db.Diseases
                  select new Model.Disease
                  {
                  DiseaseId = Diseases.DiseaseId,
                  DiseaseName = Diseases.DiseaseName,
                      drug = (from d in db.Drug
                      where (Diseases.DiseaseId == d.DiseaseId
                      select new drug
                      {
                      DrugId = d.drug,
                      DrugName = d.drugName
                      }).OrderBy(m => m.DrugName).ToList(),
                   }).OrderBy(d => d.DiseaseName).ToList();
                  return Disease;
                 }
            }

            public List<Model.Disease> GetDiseaseById(Guid DiseaseId)
            {
                var Disease = (from Diseases in db.Diseases
                    select new Model.Disease
                    {
                    DiseaseId = Diseases.DiseaseId,
                    DiseaseName = Diseases.DiseaseName,
                        drug = (from d in db.Drug
                        where (Diseases.DiseaseId == d.DiseaseId && d.DrugId == 
 1)
                        select new drug
                            {
                            DrugId = d.drug,
                            DrugName = d.drugName
                            }).OrderBy(m => m.DrugName).ToList(),
                   }).OrderBy(d => d.DiseaseName).ToList().FirstOrDefault();
       return Disease;   
                }
            }


        private string BuildreimbursementDisplay(IEnumerable<ReimbursementDisease> displayList)

【问题讨论】:

  • 你能写一个有意义的标题吗?
  • 您所描述的类似于Find()First()Single() IEnumerable 扩展方法,但它们都不同,并且都有自己的用例。你想达到什么目的。我认为无论如何,您将需要第二种方法。
  • 或者另一种骇人听闻的方式,但会起作用:BuildreimbursementDisplay(new IEnumerabe().Add(the_single_disease));
  • 假设您已经拥有返回可枚举对象和单个对象的函数。要从对象列表中获取单个对象 - 使用 Hogan 的答案

标签: c# ienumerable


【解决方案1】:

您应该能够很好地执行以下操作。

public Model.Disease GetFirstDisease()
{
  return GetDisease().FirstOrDefault();
}

类似的方法也可以

public Model.Disease GetDiseaseById(Guid DiseaseId)
{
  return GetDisease().Where(x => x.DiseaseId == DiseaseId).FirstOrDefault();
}

如果您只想使用一个功能来“花哨”或使其“更简单”,请不要这样做。重用很重要(就像我在上面所做的那样),但是无缘无故地让它变得非常复杂只会让代码变得糟糕。变得花哨——保持简单,这样会更容易维护和发现错误。

【讨论】:

  • 当我执行 FirstOrDefault 时,我用更多关于 linq 语句的信息更新了帖子,我收到了错误 system.collections.generic.list。
  • @Jefferson -- 当然可以 -- 在这里使用 ToList() 没有意义。把它拿出来。
【解决方案2】:

从外观上看,您已经有 2 种方法。一个获得疾病列表的人

公共列表GetDisease()

还有一个通过 guid 得到单一疾病的人

public Model.Disease GetDiseaseById(Guid DiseaseId)

考虑到您询问是否可以将 BuildreimbursementDisplay(IEnumerable displayList) 用于单一疾病和疾病列表,并且您对它的工作方式感到满意 - 是的,您可以:

var disease = GetDiseaseById([disease_guid]);
string result = BuildreimbursementDisplay(new List<Model.Disease>().Add(disease));

这基本上会将单一疾病转换为只有一个成员的列表。不理想,但我可以假设 BuildreimbursementDisplay 做了这样的事情:

string BuildreimbursementDisplay(List<Model.Disease> diseases)
{
string foo ="";

foreach (var disease in diseases)
  {
  foo += <...>;
  }
return foo;
}

所以它只会循环一次。

注意:您需要检查 disease == null 场景。

【讨论】:

  • 当我执行 FirstOrDefault 时,我用更多关于 linq 语句的信息更新了帖子,我收到了错误 system.collections.generic.list。
猜你喜欢
  • 2023-04-08
  • 2015-09-27
  • 2012-10-21
  • 2015-03-26
  • 1970-01-01
  • 2021-09-04
  • 2016-09-21
  • 1970-01-01
  • 2021-10-07
相关资源
最近更新 更多