List obj 怎样使用BinarySearch某个属性??

lovingkiss 2018-11-26 07:12:17
List<T> obj 怎样使用BinarySearch某个属性??

例如按OrderID排序后,搜索OrderID="ABC"的T,或者有其它快速搜索的办法
...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovingkiss 2018-11-28
  • 打赏
  • 举报
回复
引用 5 楼 以专业开发人员为伍 的回复:
[quote=引用 楼主 lovingkiss 的回复:]
例如按OrderID排序后,搜索OrderID="ABC"的T,或者有其它快速搜索的办法


你其实也已经知道了,前提是已经排序的数据结构,而绝不是随便排列的一个集合。[/quote]

我需要的是类似于3楼的那种处理方案

引用 11 楼 xuzuning 的回复:
比如
        class pp : IComparable
{
public int Id;
public string Name;
public int CompareTo(object o)
{
return Id - (o as pp).Id;
}
}
static void Main(string[] args)
{
var a = new[] {
new pp() {Id = 1, Name = "a"},
new pp() {Id = 2, Name = "a"},
new pp() {Id = 3, Name = "a"},
new pp() {Id = 4, Name = "a"},
new pp() {Id = 5, Name = "a"},
new pp() {Id = 6, Name = "a"},
new pp() {Id = 7, Name = "a"},
new pp() {Id = 8, Name = "a"},
new pp() {Id = 9, Name = "a"},
}.ToList();
var t = new pp() { Id = 6, Name = "a" };
var b = a.BinarySearch(t);//, x => t.Id.CompareTo(x.Id));

Console.WriteLine(b); //5
}


好的,谢谢,就是要这样的结构,百度没搜到相关资料。

大的集合数据中,快速查找符合条件的选项还有其它的解决方法吗??
xuzuning 2018-11-28
  • 打赏
  • 举报
回复
比如
        class pp : IComparable
{
public int Id;
public string Name;
public int CompareTo(object o)
{
return Id - (o as pp).Id;
}
}
static void Main(string[] args)
{
var a = new[] {
new pp() {Id = 1, Name = "a"},
new pp() {Id = 2, Name = "a"},
new pp() {Id = 3, Name = "a"},
new pp() {Id = 4, Name = "a"},
new pp() {Id = 5, Name = "a"},
new pp() {Id = 6, Name = "a"},
new pp() {Id = 7, Name = "a"},
new pp() {Id = 8, Name = "a"},
new pp() {Id = 9, Name = "a"},
}.ToList();
var t = new pp() { Id = 6, Name = "a" };
var b = a.BinarySearch(t);//, x => t.Id.CompareTo(x.Id));

Console.WriteLine(b); //5
}
xuzuning 2018-11-28
  • 打赏
  • 举报
回复
用 BinarySearch 也是一样的,只是要求集合是以排序的,并且 T 实现了 IComparer<T> 或显示传入 IComparer<T>实现

之所以我没说,是因为准备工作太多,估计你一时接受不了
stherix 2018-11-28
  • 打赏
  • 举报
回复
引用 8 楼 lovingkiss 的回复:
[quote=引用 3 楼 stherix 的回复:] 先需要定义一个类比如c继承IComparer<T>,并且实现接口的Compare方法 然后 用obj.BinarySearch(new T{OrderID="ABC"}, new c());
应该类似这样的,但是这个比较结构,怎样写?? 前面已经定义了OrderID="ABC",后面比较器怎样写?[/quote] http://www.blogjava.net/gddg/archive/2008/02/25/182083.html
lovingkiss 2018-11-28
  • 打赏
  • 举报
回复
引用 3 楼 stherix 的回复:
先需要定义一个类比如c继承IComparer<T>,并且实现接口的Compare方法

然后
用obj.BinarySearch(new T{OrderID="ABC"}, new c());


应该类似这样的,但是这个比较结构,怎样写??
前面已经定义了OrderID="ABC",后面比较器怎样写?
lovingkiss 2018-11-28
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
搜索指定的 T 用 IndexOf 或 Find
搜索指定 的T成员用 Find
若取得全部符合条件的 T,用 FindAll

都已经替你预备好了,不需要你去冥想


我要的是BinarySearch筛选,不是你说的这类
lovingkiss 2018-11-28
  • 打赏
  • 举报
回复
引用 5 楼 以专业开发人员为伍 的回复:
[quote=引用 楼主 lovingkiss 的回复:]
例如按OrderID排序后,搜索OrderID="ABC"的T,或者有其它快速搜索的办法


你其实也已经知道了,前提是已经排序的数据结构,而绝不是随便排列的一个集合。[/quote]

集合已经排序了,如何写这个二分法查找呢??
  • 打赏
  • 举报
回复
引用 楼主 lovingkiss 的回复:
例如按OrderID排序后,搜索OrderID="ABC"的T,或者有其它快速搜索的办法
你其实也已经知道了,前提是已经排序的数据结构,而绝不是随便排列的一个集合。
  • 打赏
  • 举报
回复
你说的那个叫做 SortedSet<> 或者 SortedList<>,根本不是 List<>。
stherix 2018-11-27
  • 打赏
  • 举报
回复
先需要定义一个类比如c继承IComparer<T>,并且实现接口的Compare方法 然后 用obj.BinarySearch(new T{OrderID="ABC"}, new c());
xuzuning 2018-11-26
  • 打赏
  • 举报
回复
搜索指定的 T 用 IndexOf 或 Find
搜索指定 的T成员用 Find
若取得全部符合条件的 T,用 FindAll

都已经替你预备好了,不需要你去冥想
threenewbee 2018-11-26
  • 打赏
  • 举报
回复
dynamic d = obj; d.OrderID

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧