我有一大堆值存储在 .net 2.0 哈希表中。我真正想找到的是一种在表上执行 SQL 选择语句的方法。
意思是,我想获得一个键列表,其关联值与一个非常简单的文本模式匹配(沿着“以数字开头”的行。)
最终目标是从哈希表中删除这些记录以进行进一步处理。
一段时间以来,我一直在反对这个问题,但我似乎无法提出任何建议。
有任何想法吗?
(万一这很重要:由于该项目的实际情况,任何第 3 方小部件或升级到 .net 的更新版本都不可行。)
如果您真的在寻找以数字开头的东西,那么您可以比使用 Regex 更快地完成它。只需查看每个键的第一个字符并确定它是否为数字。将要删除的密钥存储在列表中,因为您只需要保留密钥。
List<string> keysToRemove = new List<string>( myhashtable.Count );
foreach (string key in myhashtable.Keys)
{
if (char.IsDigit(key[0])
{
keysToRemove.Add(key);
}
}
foreach (string key in keysToRemove)
{
myhashtable.Remove(key);
}
您可以对哈希表中的每个键使用正则表达式。这很脏,但它有效:
static void Main(string[] args)
{
Hashtable myhashtable = new Hashtable();
myhashtable.Add("Teststring", "Hello");
myhashtable.Add("1TestString1", "World");
myhashtable.Add("2TestString2", "Test");
List<String> newht = new List<String>;
//match all strings with a number at the front
Regex rx = new Regex("^[1-9]");
foreach (string key in myhashtable.Keys)
{
if (rx.IsMatch(key) == true)
{
newht.Add(key);
}
}
//Loop through all the keys in the new collection and remove them from
//them from the main hashtable.
foreach (string key in newht)
{
myhashtable.Remove(key);
}
}
编辑:只是为了好玩,这里是 LINQ 版本(对不起,我也有过)。
Hashtable myhashtable = new Hashtable();
myhashtable.Add("Teststring", "Hello");
myhashtable.Add("1TestString1", "World");
myhashtable.Add("2TestString2", "Test");
Regex rx = new Regex("^[1-9]");
var k = (from string key in myhashtable.Keys
where rx.IsMatch(key)
select key).ToList();
k.ForEach(s => myhashtable.Remove(s));
编辑:我刚刚添加了 sting 列表而不是哈希表,我不记得哪个 .net 版本中有通用列表 ***拍了额头
使用 LINQ:
Dim myhashtable As New Hashtable
myhashtable.Add("Teststring", "Hello")
myhashtable.Add("1TestString1", "World")
myhashtable.Add("2TestString2", "Test")
For Each i As String In From Element In myhashtable.Cast(Of DictionaryEntry)() Let k = DirectCast(Element.Value, String) Where k.StartsWith("W") Select DirectCast(Element.Key, String)
MsgBox("This key has a matching value:" & i)
Next
但如果使用 LINQ,最好使用 Dictionary:
Dim d = New Dictionary(Of String, String)()
d.Add("Teststring", "Hello")
d.Add("1TestString1", "World")
d.Add("2TestString2", "Test")
For Each i As String In From element In d Where element.Value.StartsWith("W") Select element.Key
MsgBox("This key has a matching value:" & i)
Next
而不是 .StartsWith("W") 你当然可以做任何其他你想要的过滤。