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;
}
...全文
7790 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,那只能遍历去找

111,129

社区成员

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

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

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