LINQ在看似charArray中返回IEnumerable <string>值

时间:2015-06-30 09:43:12

标签: c# linq

我有一个

IEnumerable<KeyValuePair<string,string>>

在这个IEnumerable中我有一个名为“JobDetails”的密钥为了确保这个密钥存在,我使用以下语句;

  var avalue = from val in tokensReturned where val.Key == "JobDetails" select val.Key;

我期望传递这个断言,因为Key就在那里

Assert.AreEqual("JobDetails", avalue);

我得到的信息是预期的:'J'但是“JobDetails”

还表示值在索引0处不同

如果我在断言中将.first()添加到avalue然后测试通过,这是正确的做法吗?我是一个LINQ新手并且不想添加。首先因为它有效,我想知道正确的做法是什么。

提前致谢

2 个答案:

答案 0 :(得分:3)

是的,您必须添加.First() ... select将返回另一个IEnumerable<>,其元素与tokensReturnedKey == "JobDetails"的元素一样多}}。具有0或1个元素的IEnumerable<T>仍为IEnumerable<T>。它并非隐含/自动“十年”到其“通用”T类型(在您的情况下为string)。通过使用.First(),您可以提取IEnumerable<T>的第一个元素,即T个对象。如果没有元素,你会得到一个例外。

如果您确定应该有一个元素,我经常建议使用.Single(),这将检查是否有1个元素(这是一个额外的检查,在您使用DB时很有用,你在哪里认为应该返回1个元素并不总是返回1个元素,因为您认为包含在DB中的内容并不完全是DB中包含的内容。

答案 1 :(得分:1)

由于您已经过滤掉了那些匹配的项目,因此您只需要检查您拥有的项目数量:

Assert.AreEqual(1, avalue.Count());

如果您尝试使用First()Single()提取第一个项目,则会冒着测试抛出非断言异常的风险,因为您没有拥有第一个(或单个)项目。