Unity 6.3
0 онлайн 67 гостей 3 в системе
Вход

QueryEngine<T0>.SetSearchDataCallback

Declaration

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.

Declaration

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})";
        }
    }
}