[英]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 %” ,它應該顯示:
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.