Доброе утро Мне нужно кое-что узнать о поиске в 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 ? Спасибо