C# 如何从对象数组中获取字符串值?

C# 如何从对象数组中获取字符串值?,c#,.net,arrays,C#,.net,Arrays,我有一些代码,基本上检查当前业务对象已通过的队列列表。这些队列保存在一个名为\u queueNames的数组中,该数组的类型为IKeyMap,是我公司使用的自定义对象 我希望获得队列的文本名称,因为我需要检查特定关键字的存在,如果它击中了特定队列,则需要单独处理它 我希望我能像这样做 var queues = _queueNames.ToArray().ToString(); if (queues.Contains("Condition")) DoSomethingElse();

我有一些代码,基本上检查当前业务对象已通过的队列列表。这些队列保存在一个名为
\u queueNames
的数组中,该数组的类型为
IKeyMap
,是我公司使用的自定义对象

我希望获得队列的文本名称,因为我需要检查特定关键字的存在,如果它击中了特定队列,则需要单独处理它

我希望我能像这样做

 var queues = _queueNames.ToArray().ToString();
 if (queues.Contains("Condition"))
     DoSomethingElse();
但这只是给了我对象类型,而不是值的集合。查看KeyMap对象,看起来只是一个简单的键/值对,是否有其他方法可以做到这一点

编辑:
KeyMap
类和接口:

public interface IKeyMap : IDisposable
{
    string Ley {get;}
    string Field {get;}
}

public class KeyMap : IKeyMap
{
    string _key, field;

    public KeyMap(string key, string field)
    {
        _key = key;
        _field = field;
    }

    public override string ToString()
    {
        return string.Format("{0}_{1}", Key, Field);
    }

    public string Key { get {return _key; } }
    public string Field { get {return _field; } }
}

我遗漏了一些覆盖,例如hashing和Dispose方法,因为我必须手动键入它,所以无法从远程会话复制粘贴:(

在不知道队列名称中的对象是什么样子的情况下,没有确切的答案。这里犯的一个错误是,您正在检查表示整个数组的单个字符串。您要做的是检查数组中的每个对象是否有某个值,或者将其转换为字符串并检查该值

以下是一个例子:

foreach (var item in array)
{
    if (item.ToString().Contains("Condition"))
    {
        DoSomethingElse();
        break;
    }
}
或者LINQ的方式:

if (array.Any(item => item.ToString().Contains("Condition")))
    DoSomethingElse();

此特定示例仅在对象可以转换为有助于解析的字符串时有效。您也可以访问该对象上的成员或调用该对象上的函数来获取字符串。没有更多信息我们无法知道,但希望这能为您指明正确的方向。

在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}

我可能误读了这一点,但有什么原因不能将队列按名称存储在键/值对数组中,甚至是字典中?例如:

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.
或者,您可以使用LINQ获取名称包含特殊字符串的任何队列:

var results = queues.Where(keyValuePair => keyValuePair.Key.Contains(mySpecialString)).ToArray();

这就是说,Mason的观点是,您可能需要担心字符串匹配之类的问题。当然,有几种方法可以做到这一点。如果所有队列都有一个固定的名称,那么我喜欢创建一个包含一组静态字符串的NameConstants类,并引用该类的成员。或者您可以做一些事情,例如将它们都设置为大写和小写与之相比。

请提供IKeyMap类型的代码。顺便说一句,检查字符串不是一个好方法。相反,你应该在IKeyMap上有一个布尔或枚举属性,你应该用它作为一个标志,以知道是否应该以不同的方式处理。@mason编辑以包括大多数KeyMap类编辑了文章包括KeyMap类型的外观。由于您的对象实现了.ToString(),这应该可以工作,但是执行.Contains()操作正如@mason在评论你的作品时指出的那样,寻找字符串并不是检查某些条件的最佳方式。不幸的是,这是一个如此巨大的应用程序,我不确定这可能会产生什么样的后果,也可能永远不会得到批准。不过,我会尝试!不幸的是,这个应用程序有多大,我确实这么做了不知道如何/在其他地方使用
IKeyMap
对其进行更改,或更改
\u queueNames
的类型。比较字符串很糟糕,我当然同意,但我认为我没有很多可行的选择。
var results = queues.Where(keyValuePair => keyValuePair.Key.Contains(mySpecialString)).ToArray();