簡體   English   中英

使用包含在 C# 字典中的部分或完整單詞搜索對象

[英]Searching objects using Partial or complete Words contained into C# dictionary

早上好,我需要了解一些有關使用 LinQ 和 Unity3d 在 C# 詞典中搜索的知識。

事情是這樣的:

我有以下課程:

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

我還有一個用於此目的的搜索欄:如果我輸入 "Warrior" ,我應該得到所有 "Warrior" 字符,按名稱排序。 但是如果輸入“War”,則 OutPut Dictionary 中沒有任何內容。

在 SQL 語法中,我可以使用“Like % War %” ,它應該顯示:

  • "卡羅萊納州", "8";
  • "阿拉貢", "8";
  • "博羅米爾", "8"; 但是在 C# 中使用 LinQ 我不知道我該怎么做......主要問題是我如何在 C# 中使用字典和 LinQ 做到這一點 謝謝
var matches = ClassDictionary.Keys.Where(k => k.Contains("War"));

您可以使用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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM