OrderedDictionary 值不返回列表而是返回对象
OrderedDictionary value not returning list but object
好吧,我放弃了。这可能是我所缺少的非常简单的东西,但过去 2 个小时我一直坚持这个,我无法在网上的任何地方找到答案。下面的代码在我的 foreach
中的 list
中显示了一个 CS1579 错误:
"foreach statement cannot operate on variables of type 'object' because 'object' does not contain a public definition for 'GetEnumerator'".
我的 roomList[roomNameTest]
return 不应该是 List<string>
吗?
var roomList = new OrderedDictionary();
var listA = new List<string>();
listA.Add("elemA");
listA.Add("elemB");
roomList["roomA"] = listA;
var roomNameTest = "roomA";
if (roomList.Contains(roomNameTest))
{
var list = roomList[roomNameTest];
foreach (var item in list)
{
Console.WriteLine(item);
}
}
解决方案:
使用 Dictionary<string, List<string>>()
效果非常好,我稍后根据需要使用 OrderBy(x => x.Key)
对字典进行排序。感谢大家的贡献,非常感谢。
嗯,由于 OrderedDictionary
的项声明为 object
类型,.Net 将它们视为
object
的实例,不实现 IEnumerable
。例如你可以很容易地把
roomList.Add("abc", 123);
roomList.Add("def", true);
roomList.Add("pqr", "bla-bla-bla");
您可以尝试投射这些物品
进入 IEnumerable<string>
并成功循环:
var roomList = new System.Collections.Specialized.OrderedDictionary();
var listA = new List<string>();
listA.Add("elemA");
listA.Add("elemB");
// Note "Add", since item with Key == "roomA" doesn't exist
roomList.Add("roomA", listA);
var roomNameTest = "roomA";
if (roomList.Contains(roomNameTest)) {
// if item implements IEnumerable<string>, say it List<string>
// we can loop over it
if (roomList[roomNameTest] is IEnumerable<string> list)
foreach (var item in list) {
Console.WriteLine(item);
}
}
OrderedDictionary
不是通用的 class,因此它仅适用于 object
。您将需要转换或使用不同类型的集合。例如:
var list = (List<string>) roomList[roomNameTest];
但是如果您向字典中添加不是 <List<string>
的内容,这可能会导致问题。
此外,我不太确定您是否需要在这里使用 OrderedDictionary
,强类型 Dictionary<string, List<string>>
会好得多。例如:
var roomList = new Dictionary<string, List<string>>();
//...
if (roomList.ContainsKey(roomNameTest))
{
//...
}
虽然我也建议使用 TryGetValue
:
if(roomList.TryGetValue(roomNameTest, out var list))
{
foreach (var item in list)
{
Console.WriteLine(item);
}
}
好吧,我放弃了。这可能是我所缺少的非常简单的东西,但过去 2 个小时我一直坚持这个,我无法在网上的任何地方找到答案。下面的代码在我的 foreach
中的 list
中显示了一个 CS1579 错误:
"foreach statement cannot operate on variables of type 'object' because 'object' does not contain a public definition for 'GetEnumerator'".
我的 roomList[roomNameTest]
return 不应该是 List<string>
吗?
var roomList = new OrderedDictionary();
var listA = new List<string>();
listA.Add("elemA");
listA.Add("elemB");
roomList["roomA"] = listA;
var roomNameTest = "roomA";
if (roomList.Contains(roomNameTest))
{
var list = roomList[roomNameTest];
foreach (var item in list)
{
Console.WriteLine(item);
}
}
解决方案:
使用 Dictionary<string, List<string>>()
效果非常好,我稍后根据需要使用 OrderBy(x => x.Key)
对字典进行排序。感谢大家的贡献,非常感谢。
嗯,由于 OrderedDictionary
的项声明为 object
类型,.Net 将它们视为
object
的实例,不实现 IEnumerable
。例如你可以很容易地把
roomList.Add("abc", 123);
roomList.Add("def", true);
roomList.Add("pqr", "bla-bla-bla");
您可以尝试投射这些物品
进入 IEnumerable<string>
并成功循环:
var roomList = new System.Collections.Specialized.OrderedDictionary();
var listA = new List<string>();
listA.Add("elemA");
listA.Add("elemB");
// Note "Add", since item with Key == "roomA" doesn't exist
roomList.Add("roomA", listA);
var roomNameTest = "roomA";
if (roomList.Contains(roomNameTest)) {
// if item implements IEnumerable<string>, say it List<string>
// we can loop over it
if (roomList[roomNameTest] is IEnumerable<string> list)
foreach (var item in list) {
Console.WriteLine(item);
}
}
OrderedDictionary
不是通用的 class,因此它仅适用于 object
。您将需要转换或使用不同类型的集合。例如:
var list = (List<string>) roomList[roomNameTest];
但是如果您向字典中添加不是 <List<string>
的内容,这可能会导致问题。
此外,我不太确定您是否需要在这里使用 OrderedDictionary
,强类型 Dictionary<string, List<string>>
会好得多。例如:
var roomList = new Dictionary<string, List<string>>();
//...
if (roomList.ContainsKey(roomNameTest))
{
//...
}
虽然我也建议使用 TryGetValue
:
if(roomList.TryGetValue(roomNameTest, out var list))
{
foreach (var item in list)
{
Console.WriteLine(item);
}
}