游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:786

当前位置:游戏蛮牛 技术专区 教程分享

查看: 324|回复: 0

[入门教程] 关于LINQ查询

[复制链接]  [移动端链接]
5熟悉之中
969/1000
排名
2567
昨日变化

3

主题

20

帖子

969

积分

Rank: 5Rank: 5

UID
38910
好友
2
蛮牛币
1559
威望
0
注册时间
2014-8-9
在线时间
410 小时
最后登录
2018-9-25
QQ
发表于 2018-4-16 15:46:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
偶然学习到的,拿出来和大家分享下!

1、首先定义两个类,Player和Skill

[C#] 纯文本查看 复制代码
/// <summary>
/// 玩家
/// </summary>
public class Player
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public string Skill { get; set; }
	public int Level { get; set; }

    public override string ToString()
    {
        return string.Format("Id:{0},Name:{1},Age:{2},Skill:{3},Level:{4}",Id,Name,Age,Skill,Level);
    }
}



/// <summary>
/// 技能
/// </summary>
public class Skill
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Power { get; set; }

    public override string ToString()
    {
        return string.Format("Id:{0},Name:{1},Power:{2}",Id,Name,Power);
    }
}


在Unity中创建一个Test测试脚本,声明Player的集合userList,和Skill的集合skillList,并在Start中进行初始化:

[C#] 纯文本查看 复制代码
 List<Player> userList;
    List<Skill> skillList;

    private void Start()
    {
        userList = new List<Player>()
        {
            new Player() { Id=1,Name="谢静璇",Age=28,Skill="镜花水月",Level= 8 },
            new Player() { Id=2,Name="秦烈",Age=30,Skill="炎阳焚天",Level=10 },
            new Player() { Id=3,Name="宋婷玉",Age=26,Skill="醉生梦死",Level=9 },
            new Player() { Id=4,Name="令狐冲",Age=31,Skill="独孤九剑",Level=6 },
            new Player() { Id=5,Name="郭靖",Age=28,Skill="九阴真经",Level=11 },
            new Player() { Id=6,Name="东方不败",Age=26,Skill="葵花宝典",Level=12 },
            new Player() { Id=7,Name="萧峰",Age=28,Skill="降龙十八掌",Level=12 },
            new Player() { Id=8,Name="任我行",Age=35,Skill="吸星大法",Level=10 },
            new Player() { Id=9,Name="段誉",Age=27,Skill="六脉神剑",Level=9 },
            new Player() { Id=10,Name="张三丰",Age=100,Skill="太极",Level=100 },
        };

        skillList = new List<Skill>()
        {
            new Skill() { Id=1,Name="镜花水月",Power=90 },
            new Skill() { Id=2,Name="炎阳焚天",Power=100 },
            new Skill() { Id=3,Name="醉生梦死",Power=98 },
            new Skill() { Id=4,Name="独孤九剑",Power=120 },
            new Skill() { Id=5,Name="九阴真经",Power=110 },
            new Skill() { Id=6,Name="葵花宝典",Power=150 },
            new Skill() { Id=7,Name="降龙十八掌",Power=130 },
            new Skill() { Id=8,Name="吸星大法",Power=100 },
            new Skill() { Id=9,Name="六脉神剑",Power=80 },
            new Skill() { Id=10,Name="太极",Power=150 }
        };

    }



2、在userList中查询等级(Level)大于10的玩家,并打印出来:
方法一:
[C#] 纯文本查看 复制代码
List<Player> tempList = new List<Player>();
        for (int i = 0; i < userList.Count; i++)
        {
            if (userList[i].Level > 10)
                tempList.Add(userList[i]);
        }

        foreach (var item in tempList)
        {
            Debug.Log(item);
        }



方法二(使用LINQ查询):
[C#] 纯文本查看 复制代码
var tempList = from p in userList
                       where p.Level > 10
                       select p;

        foreach (var item in tempList)
        {
            Debug.Log(item);
        }



方法三(使用LINQ查询,过滤法):
[C#] 纯文本查看 复制代码
var tempList = userList.Where(WhereTest);

        foreach (var item in tempList)
        {
            Debug.Log(item);
        }



[C#] 纯文本查看 复制代码
// 过滤方法
    bool WhereTest(Player _player)
    {
        if (_player.Level > 10)
            return true;

        return false;
    }



方法四:
[C#] 纯文本查看 复制代码
var tempList = userList.Where(p=>p.Level > 10);

        foreach (var item in tempList)
        {
            Debug.Log(item);
        }



如果是多条件查询,userList.Where(p=>p.Level > 10 && Age > 30) ,用&&符继续添加筛选条件。

3、联合查询,查询技能伤害Power大于100的玩家信息:
方法一:
[C#] 纯文本查看 复制代码
List<Player> tempList = new List<Player>();

        for (int i = 0; i < userList.Count; i++)
        {
            for (int j = 0; j < skillList.Count; j++)
            {
                if (userList[i].Skill == skillList[j].Name)
                {
                    if (skillList[j].Power > 100)
                        tempList.Add(userList[i]);
                }
            }
        }

        foreach (var item in tempList)
        {
            Debug.Log(item);
        }



方法二(LINQ联合查询):
[C#] 纯文本查看 复制代码
var tempList = from p in userList
                       from k in skillList
                       where p.Skill == k.Name && k.Power > 100
                       select p;

        foreach (var item in tempList)
        {
            Debug.Log(item);
        }



方法三:
[C#] 纯文本查看 复制代码
var tempList = userList.SelectMany(p=>skillList,(p,k)=>new { player = p,skill = k}).Where(x=>x.player.Skill == x.skill.Name && x.skill.Power > 100);

        foreach (var item in tempList)
        {
            Debug.Log(item);
        }



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表