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

QueryEngine<T0>.SetSearchDataCallback

建议更改

成功!

感谢你帮助我们提升 Unity 文档质量。虽然我们无法接受所有提交,但我们确实从用户处阅读每条建议的更改,并在适用的情况下进行更新。

关闭

提交失败

由于某种原因,你的建议更改无法提交。请在几分钟后<a>重试</a>。感谢你抽出时间帮助我们提升 Unity 文档质量。

关闭

取消

声明

public void SetSearchDataCallback(Func<TData,IEnumerable<string>> getSearchDataCallback);

声明

public void SetSearchDataCallback(Func<TData,IEnumerable<string>> getSearchDataCallback, stringComparison stringComparison);

参数

getSearchDataCallback 用于获取与搜索词进行匹配数据的回调。获取 TData 类型对象并返回 IEnumerable 字符串。
stringComparison 字符串比较选项。

说明

设置用于获取与搜索词进行匹配的回调。

此函数允许你注册回调,该回调将在你尝试筛选的数据集的每个元素上调用,以检索将与搜索词(例如,不是筛选器的词)进行比较的搜索数据。这里给出了一个示例

// Set up what data from objects of type MyObjectType will be matched against search words
queryEngine.SetSearchDataCallback(myObj => new[] { myObj.id.ToString(), myObj.name });

有关如何使用此函数的更完整示例,请参阅 QueryEngine


声明

public void SetSearchDataCallback(Func<TData,IEnumerable<string>> getSearchDataCallback, Func<string,string> searchWordTransformerCallback, stringComparison stringComparison);

参数

getSearchDataCallback 用于获取与搜索词进行匹配数据的回调。获取 TData 类型对象并返回 IEnumerable 字符串。
searchWordTransformerCallback 在查询解析期间用于转换搜索词的回调。在大写或小写比较时非常有用。可以返回 null 或空字符串以从查询中移除该词。
stringComparison 字符串比较选项。

说明

设置用于获取与搜索词进行匹配的回调。

此函数允许你注册回调,该回调将在你尝试筛选的数据集的每个元素上调用,以检索将与搜索词(例如,不是筛选器的词)进行比较的搜索数据。另外,它还让你能够对搜索词本身应用转换,以便为比较做好准备。此转换在解析查询时只执行一次。

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

static class Example_QueryEngine_SetSearchDataCallback
{
    static List<MyObjectType> s_Data;

    [MenuItem("Examples/QueryEngine/SetSearchDataCallback")]
    public static void RunExample()
    {
        // Set up the query engine
        var queryEngine = new QueryEngine<MyObjectType>();

        // Set the search data callback with a word transformer.
        // The word transformer will make sure that the words used for comparison are already converted to lowercase,
        // which will increase performance by doing comparisons with Ordinal instead of OrdinalIgnoreCase
        queryEngine.SetSearchDataCallback(myObj => new[] { myObj.id.ToString(), myObj.name }, word => word.ToLowerInvariant(), StringComparison.Ordinal);

        s_Data = new List<MyObjectType>()
        {
            new MyObjectType { id = 0, name = "Test 1", position = new Vector2(0, 0), active = false },
            new MyObjectType { id = 1, name = "Test 2", position = new Vector2(0, 1), active = true },
            new MyObjectType { id = 2, name = "Test 3", position = new Vector2(1, 0), active = false },
            new MyObjectType { id = 3, name = "Test 4", position = new Vector2(1.2f, 0), active = false },
        };

        // Find all items that contain "test" in the search data
        var query = queryEngine.ParseQuery("Test");
        var filteredData = query.Apply(s_Data).ToList();
        Debug.Assert(filteredData.Count == 4, $"There should be 4 items in the filtered list but found {filteredData.Count} items.");
        Debug.Assert(filteredData.Contains(s_Data[0]), "Test 1 should be in the list as its name contains \"test\".");
        Debug.Assert(filteredData.Contains(s_Data[1]), "Test 2 should be in the list as its name contains \"test\".");
        Debug.Assert(filteredData.Contains(s_Data[2]), "Test 3 should be in the list as its name contains \"test\".");
        Debug.Assert(filteredData.Contains(s_Data[3]), "Test 4 should be in the list as its name contains \"test\".");

        // Find all items that have exactly "test 4" in the search data.
        query = queryEngine.ParseQuery("!\"Test 4\"");
        filteredData = query.Apply(s_Data).ToList();
        Debug.Assert(filteredData.Count == 1, $"There should be 1 item in the filtered list but found {filteredData.Count} items.");
        Debug.Assert(filteredData.Contains(s_Data[3]), "Test 4 should be in the list as its name is exactly \"test 4\".");
    }

    class MyObjectType
    {
        public int id { get; set; }

        string m_Name = string.Empty;
        public string name
        {
            get => m_Name;
            set => m_Name = value.ToLowerInvariant();
        }

        public Vector2 position { get; set; } = Vector2.zero;
        public bool active { get; set; }

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