Поиск объектов с использованием Частичных или полных слов, содержащихся в словаре C# - PullRequest
0 голосов
/ 30 января 2020

Доброе утро Мне нужно кое-что узнать о поиске в C# Словаре с использованием LinQ и Unity3d.

Это вещь:

У меня есть следующее классы:

public class SearcherTest : MonoBehaviour
{
    public TextMeshProUGUI SearchTermText;
    public TMP_InputField  InputKeyWord;
    public TextMeshProUGUI ResultNumber;
    public TextMeshProUGUI ImpName;
    public TextMeshProUGUI ImpClass;
    public TextMeshProUGUI ImpHealth;
    public CompareInfo Comparer;
    public Dictionary<string, Data> ClassDictionary = new Dictionary<string, Data>();
    public Dictionary<string, Data> Result = new Dictionary<string, Data>();
    public List<string> LstResultKeys = new List<string>();
    public int NavCounter;
    void Start()
    {
        Comparer = CultureInfo.InvariantCulture.CompareInfo;
        NavCounter = -1;
        ClassDictionary.Add("Byzard", new Data(5, "Paladin"));
        ClassDictionary.Add("Ingrid", new Data(5, "Paladin"));
        ClassDictionary.Add("Carolina",new Data(8, "Warrior"));
        ClassDictionary.Add("Aragorn", new Data(8, "Warrior"));
        ClassDictionary.Add("Boromir", new Data(8, "Warrior"));

        ClassDictionary.Add("Laila", new Data(15, "Tank"));
        ClassDictionary.Add("Xenua", new Data(15, "Tank"));
        ClassDictionary.Add("Leticia", new Data(15, "Tank"));
        ClassDictionary.Add("Lila", new Data(15, "Tank"));
        ClassDictionary.Add("Yamasaki", new Data(15, "Tank"));

        ClassDictionary.Add("Jairo", new Data(3, "Necromancer"));
        ClassDictionary.Add("Felix", new Data(6, "Crafter"));
        ClassDictionary.Add("Farid", new Data(4, "Crafter"));
        ClassDictionary.Add("Willhem", new Data(4, "Crafter"));

        ClassDictionary.Add("Ivhan", new Data(9,"Support"));
        ClassDictionary.Add("Karen", new Data(9,"Support"));
        ClassDictionary.Add("Will",  new Data(9,"Support"));

        ClassDictionary.Add("JN", new Data(5, "Wizard"));
        ClassDictionary.Add("Lion", new Data(5, "Archer"));
        ClassDictionary.Add("Uyial", new Data(5, "Archer"));
    }

    public void Query( )
    {
        string _SearchKeyWord;
        _SearchKeyWord = InputKeyWord.text;
        if (string.IsNullOrEmpty(SearchTermText.text))
        {
            return;
        }
        else
        {
            LstResultKeys.Clear();
            Result = SearchQuery(ClassDictionary, _SearchKeyWord);
            LstResultKeys = Result.Keys.ToList();
            foreach (var item in Result)
            {
                Debug.Log(item.Key);
            }
        }

    }
    private Dictionary<string , Data> SearchQuery ( Dictionary<string , Data> _Dictionary, string _KeyWord)
    {
        return _Dictionary
            .Where(p => p.Value.Class == _KeyWord)
            .GroupBy(k => k.Key)
            .OrderBy(x => x.Key)
            .ToDictionary(p => p.Key, p => p.First().Value);
    }
    public void SelectNextFindedItem()//It Allows me navigate between results (Next result)
    {
        NavCounter += 1;
        if (NavCounter >=LstResultKeys.Count)
        {
            NavCounter = 0;
        }
        if (Result.TryGetValue(LstResultKeys[NavCounter],out Data _data))
        {
            ImpName.text = LstResultKeys[NavCounter];
            ImpClass.text = _data.Class;
            ImpHealth.text = _data.HealthAmount.ToString();
        }
        int mNavCounterUI = NavCounter + 1;
        int mLstResultKeys = LstResultKeys.Count;
        ResultNumber.text = string.Format("{0}/{1}", mNavCounterUI, mLstResultKeys);
    }
    public void SelectPrevFindedItem()//It Allows me navigate between results (previously result)
    {
        NavCounter -= 1;
        if (NavCounter <0)
        {
            NavCounter = LstResultKeys.Count - 1;
        }
        if (Result.TryGetValue(LstResultKeys[NavCounter], out Data _data))
        {
            ImpName.text = LstResultKeys[NavCounter];
            ImpClass.text = _data.Class;
            ImpHealth.text = _data.HealthAmount.ToString();
        }
        int mNavCounterUI = NavCounter+1;
        int mLstResultKeys = LstResultKeys.Count;
        ResultNumber.text = string.Format("{0}/{1}", mNavCounterUI, mLstResultKeys);
    }
    public void PrintData(string _name, string _Class, string _healt)
    {
        ImpName.text = _name;
        ImpClass.text = _Class;
        ImpHealth.text = _healt;
    }
}
//Holds Basic data about characters
public class Data
{
    public int HealthAmount;
    public string Class;
    public Data (int _HealthAmount, string _class)
    {
        HealthAmount = _HealthAmount;
        Class = _class;
    }
}

У меня также есть строка поиска для этих целей: если я наберу «Воин», я должен получить все символы «Воин», отсортированные по имени. Но если набрать «Война», в OutPut Dictionary ничего нет.

В синтаксисе SQL я могу использовать "Like% War%" , и он должен показать мне:

  • "Carolina", "8";
  • "Арагорн", "8";
  • "Боромир", "8"; Но в C# с использованием LinQ я не знаю, как я могу это сделать ... Главный вопрос Как я могу это сделать в C# с использованием словарей и LinQ ? Спасибо

Ответы [ 2 ]

0 голосов
/ 30 января 2020

Вы можете использовать string.Contains .

Лично я бы включил оба, либо ключ, содержащий ключевое слово, либо тип значения.

Я догадался, что вы бы также нужно иметь несколько значений, а не только первое.

private Dictionary<string, Data> SearchQuery(Dictionary<string, Data> _Dictionary, string _KeyWord)
{
    return _Dictionary
        // Use string.Contains on both keys and values
        .Where(p => p.Value.Class.Contains(_KeyWord) || p.Key.Contains(_KeyWord))
        // GroupBy for a dictionary is redundant afaik since every key is unique
        // First order by keys then by the values
        .OrderBy(x => x.Key).ThenBy(x => x.Value.Class)
        // return all Values not only linking all keys to only the first value ...
        .ToDictionary(p => p.Key, p => p.Value);
}
0 голосов
/ 30 января 2020
var matches = ClassDictionary.Keys.Where(k => k.Contains("War"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...