我需要一种基于多个关键字在对象列表中查找匹配行的方法。在下面的代码示例中,FindID() 函数是我需要实现的函数。
规则是:
- 表中的某些行以 * 作为值(通配符),这意味着它们将匹配任何值。
- 匹配的优先级是从左到右(即匹配左侧的值更重要)
一些例子:
FindID("John", "Black", "Brown");
- 应该返回 1,完全匹配
FindID("John", "Red", "Green");
- 应该返回 5(不是 7),匹配 "John" 和其他两个通配符 (*)
FindID("John", "Red", "Brown");
- 应该返回 6,匹配 "John" 和 "Brown" 以及一个通配符
FindID("Brian", "Grey", "Grey");
- 应该返回 8,匹配三个通配符
下面的代码是完整的,可以执行。
有谁知道这样做的最佳方法?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TableScan
{
class Program
{
public static TableClass _MyTable = new TableClass();
public class TableRow
{
public int ID;
public string Name;
public string Hair;
public string Eyes;
public TableRow(int _ID, string _Name, string _Hair, string _Eyes)
{
ID = _ID;
Name = _Name;
Hair = _Hair;
Eyes = _Eyes;
}
}
public class TableClass
{
public List<TableRow> Table = new List<TableRow>();
}
static void Main(string[] args)
{
// ID Name Hair Eyes
// 1 John Black Brown
// 2 Paul Brown Green
// 3 Ringo Blond Blue
// 4 George Red Blue
// 5 John * *
// 6 John * Brown
// 7 * Red *
// 8 * * *
// 9 Paul * *
CreateTable();
ShowTable();
FindID("John", "Black", "Brown"); // should return 1, complete match
FindID("John", "Red", "Green"); // should return 5 (not 7), matched on "John" and the other two wildcards (*)
FindID("John", "Red", "Brown"); // should return 6, matched on "John" and "Brown" and one wildcard
FindID("Brian", "Grey", "Grey"); // should return 8, matched on three wildcard
while (Console.ReadKey().Key == 0) { }
}
static int FindID(string _Name, string _Hair, string _Eyes)
{
// needs to be implemented
return 0;
}
static void CreateTable()
{
_MyTable.Table.Add(new TableRow(1, "John", "Black", "Brown"));
_MyTable.Table.Add(new TableRow(2, "Paul", "Brown", "Green"));
_MyTable.Table.Add(new TableRow(3, "Ringo", "Blond", "Blue"));
_MyTable.Table.Add(new TableRow(4, "George", "Red", "Blue"));
_MyTable.Table.Add(new TableRow(5, "John", "*", "*"));
_MyTable.Table.Add(new TableRow(6, "John", "*", "Brown"));
_MyTable.Table.Add(new TableRow(7, "*", "Red", "*"));
_MyTable.Table.Add(new TableRow(8, "*", "*", "*"));
_MyTable.Table.Add(new TableRow(9, "Paul", "*", "*"));
}
static void ShowTable()
{
foreach(TableRow _TableRow in _MyTable.Table)
{
Console.WriteLine("{0} {1} {2} {3}", _TableRow.ID, _TableRow.Name, _TableRow.Hair, _TableRow.Eyes);
}
}
}
}