版本: Unity 6 (6000.0)
语言English
  • C#

QueryEngine<T0>.SetSearchWordMatcher

建议修改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法采纳所有提交内容,但我们确实阅读了用户提出的每个建议修改,并在适用的情况下进行更新。

关闭

提交失败

由于某些原因,您的建议修改无法提交。请 <a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public void SetSearchWordMatcher(Func<string,bool,stringComparison,string,bool> wordMatcher);

参数

wordMatcher 搜索词匹配函数。第一个参数是搜索词。第二个参数是布尔值,表示精确匹配或不精确匹配。第三个参数是 StringComparison 选项。第四个参数是搜索数据回调返回的数组中的一个元素。如果匹配则函数返回 true,否则返回 false。

描述

设置要使用的搜索词匹配函数,以代替默认函数。设置为 null 以使用默认函数。

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEditor.Search;
using UnityEngine;

static class Example_QueryEngine_SetSearchWordMatcher
{
    static List<MyObjectType> s_Data;

    [MenuItem("Examples/QueryEngine/SetSearchWordMatcher")]
    public static void RunExample()
    {
        // Set up the query engine
        var queryEngine = new QueryEngine<MyObjectType>();
        queryEngine.AddFilter("id", myObj => myObj.id);
        queryEngine.SetSearchDataCallback(myObj => new[] { myObj.id.ToString(), myObj.name });

        // Set a lowercase word matching function
        queryEngine.SetSearchWordMatcher((searchWord, isExact, comparisonOption, searchData) =>
        {
            var searchWordLower = searchWord.ToLowerInvariant();
            var searchDataLower = searchData.ToLowerInvariant();
            if (isExact)
                return searchDataLower.Equals(searchWordLower, StringComparison.Ordinal);
            return searchDataLower.IndexOf(searchWordLower, StringComparison.Ordinal) >= 0;
        });

        s_Data = new List<MyObjectType>()
        {
            new MyObjectType { id = 0, name = "Test with lower", position = new Vector2(0, 0), active = false },
            new MyObjectType { id = 1, name = "Test With Upper", position = new Vector2(0, 1), active = true }
        };

        // Find all items that have the word "with" (lowercase and uppercase, because of our word matcher)
        var query = queryEngine.ParseQuery("with");
        var filteredData = query.Apply(s_Data).ToList();
        Debug.Assert(filteredData.Count == 2, $"There should be 2 items in the filtered list but found {filteredData.Count} items.");
        Debug.Assert(filteredData.Contains(s_Data[0]), "First item should be in the list.");
        Debug.Assert(filteredData.Contains(s_Data[1]), "Second item should be in the list.");
    }

    class MyObjectType
    {
        public int id { get; set; }
        public string name { get; set; } = string.Empty;
        public Vector2 position { get; set; } = Vector2.zero;
        public bool active { get; set; }

        public override string ToString()
        {
            return $"({id}, {name}, ({position.x}, {position.y}), {active})";
        }
    }
}