【问题标题】:Casting a sorted List back to IEnumerable is not returning any result将排序列表转换回 IEnumerable 不会返回任何结果
【发布时间】:2019-03-17 01:55:07
【问题描述】:

这是我需要在绑定之前对其进行升序排序的代码。这是从定义了汽车类型并附加到此公共控件中的 Searcher 属性的不同控件中调用的。所以在这里我尝试将其转换为列表进行排序,计数变为0。所以我不确定如何在绑定到网格之前通过汽车类型的参数对其进行排序。

IEnumerable cars = this.Searcher.Search(_enteredText);  //cars count 70

var carBL = Generics.CreateGeneric<IBindingList>(typeof(IMBindingList<>), 
     cars.GetType().GetGenericArguments()[0]);          

grdResults.DataSource = carBL ;

我的代码试图对不起作用的结果进行排序。搜索后,汽车返回的计数为 70。

var orderedcars = cars.ToEnumerable().ToList().OrderBy(x = ?) ; 

carBL 计数为 0。在排序和下一行时我没有做正确的事情。我想我需要使用 ApplySort 但不确定属性描述符应该是什么。

搜索代码(文本)

       public virtual IEnumerable<T> Search(string filter)
       {
            List<T> somelist = new List<T>(); ;
            if (lastsomelist  != null && this.Searchsomelist)
            {
                somelist = this.SearchtheList(lastsomelist  , filter);
            }
            else
            {
                somelist= this.SearchtheList(this.commoncontrol, filter);
                if ((somelist.Count == 0 )
                    somelist.AddRange(this.SearchtheList(this.multiSearchtheList, filter));
            }
            if (somelist!= null && somelist.Count > 0)
                lastsomelist  = somelist;
            else
                lastsomelist  = null;

            return somelist;

       }

【问题讨论】:

  • 你有一个简单的问题,粘贴了一大块看似过于复杂的代码,到处使用反射和强制转换,你到底想做什么?
  • 我有一个具有数据网格的用户控件,我需要发送搜索文本以匹配返回结果中的所有值并绑定到网格。但它并不像听起来那么简单。所以我需要加载那些排序(升序)的匹配。第 1 行和第 3 行已经存在,我正在对其进行更改以使其工作,包括排序
  • @Rianna - 您不能只转储大量未定义类型的代码,然后让我们猜测发生了什么。请提供minimal reproducible example
  • 所以,正如我之前提到的。 a) 将 IEnumerable cars 更改为 var cars。 b) 在运行时,请在分配了cars 后,在Immediate Window 中输入?cars.GetType()。它的类型是什么?
  • 这是我在更改为 var cars 后在运行时得到的。我从 Sedan 表单中获得了附加到“搜索器”的正确类型。 {Name = "List1" FullName = "System.Collections.Generic.List1[[XYZ.Core.SedanCode, XYZ.Core, Version=8.6.1.0, Culture=neutral, PublicKeyToken=null]]"} System.Type {System.RuntimeType}

标签: c# list linq sorting ienumerable


【解决方案1】:

改为这样做对你有用吗?

IEnumerable cars = abc.Searcher.Search(_enteredText);
var orderedcars = cars.Cast<ModelClass>().ToList().OrderBy(x => x.Name);
abc.LoadallMacthingInventory(orderedcars.AsEnumerable());

【讨论】:

  • 我正在尝试。谢谢
  • 它没有升序排序。我想可能我不应该做 var orderedcars。调试时,结果显示在结果视图中
  • 当我展开orderedcars时,点击结果视图。
  • 看来原来的问题已经解决了。我认为最好从您看到的新问题开始一个新问题。
  • 我仍然将 carBL 设为 0
【解决方案2】:

首先这里不需要orderedcars.AsEnumerable();OrderBy(x =&gt; x.Name); 子句返回IOrderedEnumerable&lt;TElement&gt;,它又派生自IEnumerable&lt;TElement&gt;,因此您可以直接将orderedcars 传递给LoadallMacthingInventory 方法,如abc.LoadallMacthingInventory(orderedcars);。因此,观察orderedcars.AsEnumerable() 没有产生结果不是由于AsEnumerable()。相反,您应该查看cars.Cast&lt;ModelClass&gt;().ToList().OrderBy(x =&gt; x.Name).Count(); 是否大于零。如果它变为零,我的嫌疑人是abc.Searcher.Search(_enteredText); 正在给你一个空列表。你可以通过检查abc.Searcher.Search(_enteredText).Count();来确认。

【讨论】:

  • 我看到计数为 70。我也编辑了问题
【解决方案3】:

在以这种方式绑定到网格之前,我使用 ApplySort 对列表进行了排序。希望这对某人有所帮助。

 PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(carBL[0]);
 PropertyDescriptor myProperty = properties.Find("Name", false);
 carBL.ApplySort(myProperty, ListSortDirection.Ascending);
 grdResults.DataSource = carBl ;  //all sorted!! 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多