我有一些代码基本上检查当前业务对象已经通过的队列列表。这些队列保存在一个名为_queueNames
的{{1}}类型的数组中,这是我公司使用的自定义对象。
我想获取队列的文本名称,因为我需要检查特定关键字是否存在,如果它碰到特定队列则单独处理。
我希望我能做这样的事情;
IKeyMap
但这只是给了我对象类型,而不是值的集合。查看KeyMap对象,看起来只是一个简单的键/值对,可能有另一种方法可以做到这一点吗?
修改: var queues = _queueNames.ToArray().ToString();
if (queues.Contains("Condition"))
DoSomethingElse();
课程&接口:
KeyMap
我遗漏了一些重写,例如哈希和哈希Dispose方法,因为我必须手动输入,不能从我的远程会话中复制粘贴:(
答案 0 :(得分:0)
在不知道_queueNames中的对象是什么样的情况下,没有确切的答案。这里犯的一个错误是您正在检查表示整个数组的单个字符串。你想要做的是检查数组中的每个对象是否有值,或者将其转换为字符串并检查该值。
以下是一个例子:
foreach (var item in array)
{
if (item.ToString().Contains("Condition"))
{
DoSomethingElse();
break;
}
}
或LINQ方式:
if (array.Any(item => item.ToString().Contains("Condition")))
DoSomethingElse();
此特定示例仅在将对象转换为可用于解析的字符串时才有效。您还可以访问成员或在所述对象上调用函数来获取字符串。我们无法在没有更多信息的情况下知道,但希望这可以指出您正确的方向。
答案 1 :(得分:0)
在你的IKeyMap界面中,我们添加一个布尔值。
public string IsSpecial { get; set; }
创建对象时,请设置IsSpecial标志。然后再读它..
var queues = _queueNames.ToArray().ToString();
if (queues.IsSpecial)
DoSomethingElse();
这可以避免搜索字符串,这是您想要避免的。如果其他队列中的一个意外地以该字符串结尾怎么办?或者,如果您在一个地方更改特殊字符串但忘记在另一个地方更改它会怎么样?或者如果资本化不同怎么办?或者如果字符串以一个你在其中看不到的特殊字符结束怎么办?
更好的方法是用enum
代替布尔。
public HandleType QueueHandleType {get;set;}
public enum HandleType {Normal, Special, SuperSpecial}
答案 2 :(得分:0)
我可能会误读这一点,但是有什么理由你不能按名称将队列存储在键/值对的数组中,甚至是字典中吗?例如:
var queues = new Dictionary<string, object>();
// add your queues to the dictionary, with the key name being your queue name
queues.Add("Queue1", myQueue);
// etc.
此时你有两个选择。首先,您不需要遍历您拥有的整个队列 - 您可以简单地执行此操作:
var specialQueue = queues[mySpecialQueueString];
// do something with it
或者您可以使用LINQ获取名称中包含特殊字符串的任何队列:
var results = queues.Where(keyValuePair => keyValuePair.Key.Contains(mySpecialString)).ToArray();
那就是说,梅森有一个观点,你可能需要担心字符串匹配等。当然,有几种方法可以解决这个问题。如果所有队列都有一个固定的名称,那么我喜欢使用一堆静态字符串创建一个NameConstants类,并引用该类的成员。或者你可以做一些事情,比如把它们全部放在上面并与之比较。