我有以下结构,这是我字典的关键:
public struct CodeAttribute
{
public int ProcessorId;
public Enums.TransactionType transactionType;
public string ErrorMessage;
}
我有以下字典(现在只有一个例子):
var errors = new Dictionary<CodeAttribute, int>
{
{CreateCodeAttributeList(2, Enums.TransactionType.Order, "Invalid ProcessorId sent in the Payment Request"), 100 }
};
我正在尝试将字典中的项目拉出与其ProcessorId和TransactionType属性匹配的结构上匹配:
private static string GetRelatedMessage(int errorCode, Dictionary<CodeAttribute, int> errorsList)
{
CodeAttribute codeAttribute = errorsList.Where(e => e.Key.ProcessorId == _processorId)
.Where(e => e.Key.transactionType == _transactionType) == errorCode;
return codeAttribute.ErrorMessage;
}
我还希望将错误代码作为过滤的一部分进行匹配,而不仅仅是payprocessorId和transactionType,只是旁注。字典中的项必须匹配所有3个值,以便在我们的案例中得到正确的值。
更新
我也尝试了这个,是的,我得到的错误是它无法将IEnumerable转换为CodeAtribute
CodeAttribute codeAttributes = errorsList.Where(e => e.Key.ProcessorId == _processorId)
.Where(e => e.Key.transactionType == _transactionType)
.Where(e => e.Value.Equals(errorCode));
更新
在Sam的帮助下,我认为这可能有用CodeAttribute codeAttribute = errorsList.FirstOrDefault(e => e.Key.ProcessorId ==
_processorId && e.Key.transactionType == _transactionType
&& e.Value == errorCode).Key;
答案 0 :(得分:2)
如果我理解正确,那么你想要
var codeAttribute = errorsList.FirstOrDefault(e =>
e.Key.ProcessorId == _processorId
&& e.Key.transactionType == _transactionType
&& e.Value == errorCode);
if(codeAttribute == null)
{
//no item matches in the dictionary.
}
return codeAttribute.Key.ErrorMessage;
请注意codeAttribute
为KeyValuePair
,因此您需要codeAttribute.Key.ErrorMessage
作为返回值。
您不需要使用Where
,因为它会返回IEnumerable
,因此如果您想要一个项目,这将无效。
答案 1 :(得分:1)
您可能需要使用以下内容:
CodeAttribute codeAttribute = errorsList.FirstOrDefault(e => e.Key.ProcessorId == _processorId && e.Key.transactionType ==_transactionType)
答案 2 :(得分:0)
虽然其他答案都是正确的,但我可能会这样写:
var errorMessage = errorsList
.Where(e => e.Key.ProcessorId == _processorId
&& e.Key.transactionType == _transactionType
&& e.Value == errorCode)
.Select(e => e.Key.ErrorMessage)
.FirstOrDefault();
也就是说,将条件推送到先前过滤,从该结果集中选择我想要的数据,然后获取转换数据的第一个结果(如果存在)。
由于IEnumerable查询 lazy ,所以这仍然会在第一个成功过滤的对象上停止。
由于源是 Dictionary ,因此设置相关的Equals / GetHashCode并构造代码以便将其使用也是谨慎的。