我基本上將具有不同變數的罪犯添加到報告中,它看起來像這樣:
reports.Add(new Report(tbxCriminalSuspicion.Text,
(new Criminal(Ordformatering(tbxName.Text), Ordformatering(tbxSex.Text), int.Parse(tbxAge.Text),
double.Parse(tbxHeight.Text), Ordformatering(tbxHairColor.Text)))));
然后我創建另一個字串,用于在罪犯之間進行搜索。您在文本框中鍵入內容,然后通過以下方式將其放入串列中:
string allSearchWords = tbxSearchWords.text;
List<string> splitSearchWords = new List<string>();
allSearchWords = allSearchWords.Replace(" ", "");
splitSearchWords = allSearchWords.Split(',').ToList();
現在我有一個單詞串列,我可以通過以下方式搜索我的罪犯:
splitSearchWords.All((criminal).Contains);
但是,在這種情況下:
罪犯1:18歲,176厘米
罪犯2:34歲,180厘米
即使只有一個 18 歲,兩名罪犯都會出現在串列框中。換句話說,是否可以使用串列作為模式來搜索完全匹配?可以附上一些代碼。
List<Report> reports = new List<Report>();
List<string> splitSearchWords = new List<string>();
private void btnSearch_Click(object sender, EventArgs e)
{
lbxLista.Items.Clear();
if (string.IsNullOrWhiteSpace(tbxSearchWords.Text))
{
MessageBox.Show("V?nligen fyll i dina s?kord innan du s?ker enligt \"S?kord, s?kord, s?kord, ...\"",
"Felinmatning", MessageBoxButtons.OK, MessageBoxIcon.Information);
//Just a check so that the searchbox isn't empty!!!!
}
else
{
string allSearchWords = tbxSearchWords.Text;
allSearshWords = allSearshWords.Replace(" ", "");
splitSearchWords = allSearchWords.Split(',').ToList();
for (int i = 0; i < reports.Count; i )
{
if(ContainsSearchWord(reports[i].GetData(), splitSearchWords))
{
lbxLista.Items.Add(reports[i].ToString());
}
}
}
}
public static bool ContainsSearchWord(string stringToTest, List<string> searchedWords)
{
return searchedWords.All((stringToTest).Contains);
}
課程、報告和刑事:
class Report
{
public string GetData()
{
return "" criminal.criminalName " " criminal.criminalSex
" " criminal.criminalAge " "
criminal.criminalHeight " " criminal.criminalHairColor;
}
}
class Criminal
{
private string privatCriminalName;
private string privatCriminalSex;
private int privatCriminalAge;
private double privatCriminalHeight;
private string privatCriminalHairColor;
public Criminal(string mCriminalName, string mCriminalSex,
int mCriminalAge, double mCriminalHeight, string mCriminalHeightColor)
{
this.criminalName = mCriminalName;
this.criminalSex = mCriminalSex;
this.criminalAge = mCriminalAge;
this.criminalHeight = mCriminalHeight;
this.criminalHairColor = mCriminalHeightColor;
}
//Then I have properties to access these from outside the class but removed due to being messy and lengthy in post.
}
程式的布局,ANM?LAN 是您進入登記犯罪的地方,S?K 是您搜索報告的地方,S?KRESULTAT 是匹配的報告將購物的地方
請原諒這篇長篇文章, 10 小時后我迷路了。
uj5u.com熱心網友回復:
您可以使用陣列而不是使用字串來測驗模式。該陣列將包含每個特征和犯罪作為單獨的string值。這樣,您仍然可以使用Contains,但它會單獨測驗字串,而不是它們的子字串。
public static bool ContainsSearchWord(string stringToTest, List<string> searchedWords) {
return searchedWords.All((stringToTest.Split(' ')).Contains);
}
您甚至不必為此創建變數,只需使用Split()已有的變數即可。
uj5u.com熱心網友回復:
是否可以使用串列作為模式搜索完全匹配?
在這里在黑暗中刺了一下,但如果你有這些字串:
criminals = new string[] {
"Criminal 1: 18 years old, 176 cm",
"Criminal 2: 34 years old, 180 cm"
}
用戶輸入這個作為他們的搜索詞:
18,old
并且您想確保“18”不匹配犯罪 2 高度中的18 0,那么您可以使用正則運算式:
var searchTerms = "18,old".Split(',').Select(s => $@"\b{s}\b").ToArray();
criminals.Where(c => searchTerms.All(st => Regex.IsMatch(c, st)));
這將只回傳字串匹配所有正則運算式的罪犯。
至關重要的是,您searchTerms已成為一個陣列,例如:
new string[] { @"\b18\b", @"\bold\b" };
意思是“\b單詞邊界” - 在“非單詞字符”(如空格、標點符號、字串的結尾/開頭等)與您要查找的單詞字符之間的零寬度字符
因此\b18\b將匹配“he is 18 years old”和“it is 18”,但不會匹配“it is 180 years old”,也不匹配“it is 218 years old”等
如果你想在沒有正則運算式的情況下這樣做,你可以在空間上分割犯罪字串:
var searchTerms = "18,old".Split(',')
criminals.Where(c => {
var words = c.Split();
return searchTerms.All(st => words.Contains(st));
} );
但它沒有那么復雜;它會old,在 中words,所以我上面的搜索詞old找不到匹配項。如果你想反駁,你必須拆分更多的東西(標點符號等)而不僅僅是空格。
現在,關于區分大小寫...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468876.html
