c#按条件取出list中的某一项

bineifeilie18 2017-03-22 03:36:07

model p1 = new model (“小红”, 15,“女”);
model p2 = new model (“小米”,10,“男”);
model p3 = new model (“小伙”, 20,“男”);

List<model > list = new List<model >();
list.Add(p1);
list.Add(p2);
list.Add(p3);


怎么按条件取出我想要的数据?如,由名字查询性别.求一个节省开销或者简便点的写法
我的笨办法是

string s;
foreach (model m in list)
{
if (m.name =="小伙")s= m.sex;
}
...全文
7464 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
token不能为空 2017-03-23
  • 打赏
  • 举报
回复
FirstOrDefault 是用 foreach实现的 Find 是用 for实现的 效率问题感觉都差不多 真正需要考虑查找效率问题的话不要使用List这种结构比较好吧
bineifeilie18 2017-03-23
  • 打赏
  • 举报
回复
引用 14 楼 shingoscar 的回复:
[quote=引用 12 楼 trh138320 的回复:] 一般来说,使用贴近底层的实现,如果你自己调度的不好,性能肯定比linq差。但是如果你调度的好,你会发现“我写了这么多代码,只比linq快了那么一点点,但是linq只有一行”,所以最终你会选择linq。”
你可以比较一下 for foreach Enumerable.FirstOrDefault List.Find 我在release模式下运行,比例差不多是1 : 1.6 : 4 : 1.3 即便是debug下,Linq也差了将近2~3倍 如果要兼顾行数和效率,那首选应该是Find而不是Linq[/quote] 刚刚我也去实测了一下,效率和你测的差不多
trh138320 2017-03-22
  • 打赏
  • 举报
回复
引用 16 楼 qq_25095899 的回复:
[quote=引用 3 楼 trh138320 的回复:] var _li=list.where(x=>x.name=="哈哈").toList(); string s=_li[0].sex;
这都可以? 如果查出来什么都没有,[0]的时候直接爆[/quote] 嗯,其实是想写count==0?do1:do2 这么写,但是只是提供个思路也懒得写那么详细了,没有在编译器上写也有很多语法错误,勿纠结
大然然 2017-03-22
  • 打赏
  • 举报
回复
引用 3 楼 trh138320 的回复:
var _li=list.where(x=>x.name=="哈哈").toList(); string s=_li[0].sex;
这都可以? 如果查出来什么都没有,[0]的时候直接爆
xuzuning 2017-03-22
  • 打赏
  • 举报
回复
list.Find(x => x.name == "小伙").sex;
Poopaye 2017-03-22
  • 打赏
  • 举报
回复
引用 12 楼 trh138320 的回复:
一般来说,使用贴近底层的实现,如果你自己调度的不好,性能肯定比linq差。但是如果你调度的好,你会发现“我写了这么多代码,只比linq快了那么一点点,但是linq只有一行”,所以最终你会选择linq。”
你可以比较一下 for foreach Enumerable.FirstOrDefault List.Find 我在release模式下运行,比例差不多是1 : 1.6 : 4 : 1.3 即便是debug下,Linq也差了将近2~3倍 如果要兼顾行数和效率,那首选应该是Find而不是Linq
bineifeilie18 2017-03-22
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
[quote=引用 4 楼 bineifeilie18 的回复:] [quote=引用 1 楼 shingoscar 的回复:] 如果限定是List,那只能遍历去找
如果是数据字典或者哈希表找起来就方便些,但是不好存[/quote] 数据结构就是这样,各有各的长处和短处 顺便说一句,2楼地方法只是减少了行数,但效率肯定比for还要差[/quote] 能说下原因么 // 摘要: // 返回序列中满足条件的第一个元素;如果未找到这样的元素,则返回默认值。 // // 参数: // source: // 要从中返回元素的 System.Collections.Generic.IEnumerable`1。 // // predicate: // 用于测试每个元素是否满足条件的函数。 // // 类型参数: // TSource: // source 中的元素的类型。 // // 返回结果: // 如果 source 为空或没有元素通过 predicate 指定的测试,则返回 default(TSource),否则返回 source 中通过 predicate // 指定的测试的第一个元素。 // // 异常: // T:System.ArgumentNullException: // source 或 predicate 为 null。 public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
trh138320 2017-03-22
  • 打赏
  • 举报
回复
引用 11 楼 shingoscar 的回复:
[quote=引用 4 楼 bineifeilie18 的回复:] [quote=引用 1 楼 shingoscar 的回复:] 如果限定是List,那只能遍历去找
如果是数据字典或者哈希表找起来就方便些,但是不好存[/quote] 数据结构就是这样,各有各的长处和短处 顺便说一句,2楼地方法只是减少了行数,但效率肯定比for还要差[/quote] 一般来说,使用贴近底层的实现,如果你自己调度的不好,性能肯定比linq差。但是如果你调度的好,你会发现“我写了这么多代码,只比linq快了那么一点点,但是linq只有一行”,所以最终你会选择linq。”
Poopaye 2017-03-22
  • 打赏
  • 举报
回复
引用 4 楼 bineifeilie18 的回复:
[quote=引用 1 楼 shingoscar 的回复:] 如果限定是List,那只能遍历去找
如果是数据字典或者哈希表找起来就方便些,但是不好存[/quote] 数据结构就是这样,各有各的长处和短处 顺便说一句,2楼地方法只是减少了行数,但效率肯定比for还要差
trh138320 2017-03-22
  • 打赏
  • 举报
回复
引用 9 楼 bineifeilie18 的回复:
[quote=引用 2 楼 Chinajiyong 的回复:] var s = list.FirsrOrDefault(s=>s.name =="小伙").sex;
按条件删除某一项该怎么写呢?[/quote] list.ReMove(list.First(.......))
bineifeilie18 2017-03-22
  • 打赏
  • 举报
回复
引用 2 楼 Chinajiyong 的回复:
var s = list.FirsrOrDefault(s=>s.name =="小伙").sex;
按条件删除某一项该怎么写呢?
bineifeilie18 2017-03-22
  • 打赏
  • 举报
回复
引用 6 楼 trh138320 的回复:
[quote=引用 3 楼 trh138320 的回复:] var _li=list.where(x=>x.name=="哈哈").toList(); string s=_li[0].sex;
其实原理就是用Linq语法去查询集合中的项,可用where,groupBy,FirstOrDefault等扩展方法 凡是实现了IEnumerable接口的都可以用[/quote] 对Linq语法不是很熟,得去翻翻书了
bineifeilie18 2017-03-22
  • 打赏
  • 举报
回复
引用 2 楼 Chinajiyong 的回复:
var s = list.FirsrOrDefault(s=>s.name =="小伙").sex;
trh138320 2017-03-22
  • 打赏
  • 举报
回复
引用 3 楼 trh138320 的回复:
var _li=list.where(x=>x.name=="哈哈").toList(); string s=_li[0].sex;
其实原理就是用Linq语法去查询集合中的项,可用where,groupBy,FirstOrDefault等扩展方法 凡是实现了IEnumerable接口的都可以用
大鱼> 2017-03-22
  • 打赏
  • 举报
回复
引用 2 楼 Chinajiyong 的回复:
var s = list.FirsrOrDefault(s=>s.name =="小伙").sex;
+1
bineifeilie18 2017-03-22
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
如果限定是List,那只能遍历去找
如果是数据字典或者哈希表找起来就方便些,但是不好存
trh138320 2017-03-22
  • 打赏
  • 举报
回复
var _li=list.where(x=>x.name=="哈哈").toList(); string s=_li[0].sex;
EnForGrass 2017-03-22
  • 打赏
  • 举报
回复
var s = list.FirsrOrDefault(s=>s.name =="小伙").sex;
Poopaye 2017-03-22
  • 打赏
  • 举报
回复
如果限定是List,那只能遍历去找
net的最近面试经典试题ASP.NET面试题集合 1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i 0 && i <= 2) return 1; else return Foo(i -1) + Foo(i - 2); } } 4.C#的委托是什么?事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 5.override与重载的区别 答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类函数的重写。为了适应需要。 6.如果在一个B/S结构的系统需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答: foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; } } 8.请编程实现一个冒泡排序算法? 答: int [] array = new int ; int temp = 0 ; for (int i = 0 ; i < array.Length - 1 ; i++) { for (int j = i + 1 ; j < array.Length ; j++) { if (array[j] < array) { temp = array ; array = array[j] ; array[j] = temp ; } } } 9.描述一下C#索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - I ; } } System.Console.WriteLine(Sum.ToString()); System.Console.ReadLine() ; 11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:一般为3层 数据访问层,业务层,表示层。 数据访问层对数据库进行增删查改。 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单。 优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。 12.在下面的例子里 using Sy

110,535

社区成员

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

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

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