问题 多值字典

凯特蒂尔

成员
已加入
2020年4月18日
留言内容
9
编程经验
1-3
各位,
我想创建一个字典,其键是字符串,值是字符串和六个变量的列表。


如何在C#中执行此操作?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
如果您想要包含一个 细绳 和其他六个值,那么您需要一个具有属性的类型 细绳 和其他六个值。定义该类型,也许将其定义为结构,但最有可能将其定义为类,然后将其指定为 字典.
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
您好,欢迎来到论坛。您在美好的一天抓住了我,因此请尝试执行以下操作:

C#:
            Dictionary<string, Tuple<string, List<string>>> kvp = new Dictionary<string, Tuple<string, List<string>>>();
            string key = "key_Value";
            string a_Value = "whatever";
            List<string> ListOf_String = new List<string>();
            string[] strArr = { "String_A", "String_B", "String_C" };
            ListOf_String.AddRange(strArr);
            Tuple<string, List<string>> tuple = new Tuple<string, List<string>>(a_Value, ListOf_String);
            kvp.Add(key, tuple);
            foreach (KeyValuePair<string, Tuple<string, List<string>>> keyValue in kvp)
            {
                //Do something with your nested items.
            }
这个整理的版本可能更容易阅读:
C#:
            Dictionary<string, Tuple<string, List<string>>> kvp = new Dictionary<string, Tuple<string, List<string>>>();
            List<string> ListOf_String = new List<string>();
            ListOf_String.AddRange(new string[] { "String_A", "String_B", "String_C" });
            kvp.Add("key_Value", new Tuple<string, List<string>>("whatever", ListOf_String));
            foreach (KeyValuePair<string, Tuple<string, List<string>>> keyValue in kvp)
            {
                //Do something with your nested items.
            }
这些类型的所有文档都可以在我的签名中找到。

根据您的要求,以上代码完全符合您的要求。希望能帮助到你。 (y)
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
只需添加,您还可以使用string [] vars = {"s1", "s2", "s3", "s4", "s5", "s6"};代替使用元组。既然我才注意到你有 价值观 并不是 价值。在这种情况下,如果您有多个值,则需要重载元组,即:

字典<string, Tuple<string, string, List<string>>> kvp = new Dictionary<string, Tuple<string, string, List<string>>>();
或使用字符串数组,而不是用多个字符串重载元组。
字典<string, Tuple<string[], List<string>>> kvp = new Dictionary<string, Tuple<string[], List<string>>>();

您还需要相应地更新代码以包括那些更改。 ;)
 

凯特蒂尔

成员
已加入
2020年4月18日
留言内容
9
编程经验
1-3
各位,

我有一个命令
<字符串,元组{字符串,整数,列表<string>}>

字典中有大约12名成员。
我需要将6个成员分组,所以要创建两个分组
这两个组的数据需要转储到excel文件中。

所以我应该去单例类或接口写在excel中转​​储列表的方法。
 
Last edited:

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
您为什么认为两者都会有用?特别是单例,因此您的类型实例不能超过一个。在这种情况下,是否有理由施加该限制?使用接口的原因有很多,包括可测试性。您是否打算编写这种类型的单元测试?如果没有,您看到定义接口的其他好处吗?在任何一种情况下,您都将在一个类中实现实例成员,因此您需要一个或另一个实现一些好处。
 

凯特蒂尔

成员
已加入
2020年4月18日
留言内容
9
编程经验
1-3
您为什么认为两者都会有用?特别是单例,因此您的类型实例不能超过一个。在这种情况下,是否有理由施加该限制?使用接口的原因有很多,包括可测试性。您是否打算编写这种类型的单元测试?如果没有,您看到定义接口的其他好处吗?在任何一种情况下,您都将在一个类中实现实例成员,因此您需要一个或另一个实现一些好处。
不,我们没有任何具体原因。我只想构建我的代码
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
那我什么都不建议。实施单例并非无缘无故。定义接口并在您的类中实现它们可能有许多优点,但是如果您不打算使用它们中的任何一个,这只是额外的工作。如果您想对代码进行未来验证,则可以肯定地实现一个接口,但是您需要确保按需使用它,否则就没有意义了。如果您必须返回并重构代码以在以后使用该接口,则也可能要等到那时才定义该接口。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,566
地点
悉尼,澳大利亚
编程经验
10+
字典仅以一种方式起作用:您提供密钥,并且密钥会为您提供相应的值。如果您不希望出现这种情况,我不确定为什么首先要创建字典。例如。
C#:
var myDictionary = new Dictionary<string, Tuple<string, int, List<string>>>();

// ...

Console.WriteLine("Enter key:");

var key = Console.ReadLine();

if (!myDictionary.ContainsKey(key))
{
    Console.WriteLine("Invalid key.");
}
else
{
    var value = myDictionary[key];

    Console.WriteLine("Value: {0}, {1}, {2}", value.Item1, value.Item2, string.Join("|", value.Item3));
}
或者:
C#:
var myDictionary = new Dictionary<string, Tuple<string, int, List<string>>>();

// ...

Console.WriteLine("Enter key:");

var key = Console.ReadLine();

if (myDictionary.TryGetValue(key, out var value))
{
    Console.WriteLine("Value: {0}, {1}, {2}", value.Item1, value.Item2, string.Join("|", value.Item3));
}
else
{
    Console.WriteLine("Invalid key.");
}
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
主题应与 问题-多值字典 -与其相同,并且是本主题的由来。

那是他从那里获取代码的地方。

C#:
            Dictionary<string, Tuple<string, int, List<string>>> myDictionary = new Dictionary<string, Tuple<string, int, List<string>>>();
            myDictionary.Add("string A", new Tuple<string, int, List<string>>("string B", 1, new List<string> { "String C" }));
            if (myDictionary.TryGetValue("string A", out var value))
            {
                Debug.WriteLine(string.Format("{0}, {1}, {2}", value.Item1, value.Item2, value.Item3[0]));
            }
输出:
细绳 B, 1, String C

Debug.WriteLine depends on the using directive for using System.Diagnostics;. String Format converts the values of the objects into strings and essentially makes them into another string. 价值.Item1; 在哪里 价值 是个 元组 在你的字典里 .Item1 如果是第一个值, 价值.Item2 是你的诠释和 价值.Item3 是你的 列表<string> 并访问其值,但调用列表中的第一个位置<string> by 价值.Item3 [0] 从元组的第三项开始。

为了更容易理解。第3行的显式版本如下所示:
C#:
            if (myDictionary.TryGetValue("string A", out Tuple<string, int, List<string>> value))
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
我同意这应该合并。

元组非常适合快速瞬态数据。在特定用户的情况下,数据似乎徘徊了一段时间,而他实际上需要进行多种操作。此外,从他的其他话题(设计方法),似乎他知道该词典将只有12个条目。

我会推荐类似的东西:
C#:
class Foo
{
    string Bar;
    int Baz;
    List<string> Bizz;
}

Dictionary<string, Foo> myData;
 

凯特蒂尔

成员
已加入
2020年4月18日
留言内容
9
编程经验
1-3
我有一本字典<string,Tuple<string,int,List<classmembers>>>mydict

当我创建像这样的字典时
神秘.Add("aaa",Tuple<"a",1,List<object>>)
假设元组中列表的长度为10
神秘.Add("bbb",Tuple<"a",1,List<object>>)"}
假设元组中列表的长度为10

字典完全填满后,它为我提供了一个映射,因为字典中每个条目的Item3计数为20(字典中第一个列表的10个和第二个条目的10个)。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
如果您没有向我们展示有关如何插入对象以及后来获得对象数量的真实代码,我们所能做的就是推测。例如,现在我推测您只是在回收与作为元组的一部分添加的对象相同的列表。
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,076
地点
挪威
编程经验
10+
Dear All,
我想创建一个字典,其键是字符串,值是字符串和六个变量的列表。


如何在C#中执行此操作?
将您的分组值整理成类结构,例如 @跳伞 在第12部分中进行了演示。使其保持简单和面向对象。
 

凯特蒂尔

成员
已加入
2020年4月18日
留言内容
9
编程经验
1-3
我创建了一个班
C#:
class DictionaryData
{
    public string Groupnme {get;set;}
    public int TableID{get;set;}
    public List<OutputData> _EMS_OutputDatas = new List<OutputData>
}

class OutputData
{
        public string Dispname {get;set;}
        public string Lablename {get;set;}
        public object unit {get;set;}
}
public List<OutputData>calculate(string DI){
    List<OutputData> OutputData_obj = new List<OutputData>();
    List<string>ruledata = new List<string>();
    for(i=0;i<ruledata.count();i++)
    {
        OutputData obj =new OutputData();
        obj.DisplayName=ruledata[i].Displayname;
        obj.Labelname = ruledata[i].lablename;
        obj.unit=ruledata[i].k;
        OutputData_obj.Add(obj);
    }
    return OutputData_obj;
    
}
void main()
{
    Dictionary<string,DictionaryData> kvp = new Dictionary<string,DictionaryData>();
    DictionaryData mydict = new DictionaryData();
    List<string> mylist = new List<string>();
    for(i=0;i<mylist.count;i++)
    {
        mydict.Groupnme = GetGroupname();
        mydict.TableID= GetTableID();
        mydict._EMS_OutputDatas=calculate(mylist[i]);
        kvp.Add(mylist[i],mydict);
        
    }
}
在这里,在所有元素添加之后,我得到dict,作为OutputData中所有列表的总和。
假设kvp dict的第一个元素在列表中有10个元素,第二个有10个元素
那么在最终kvp中,每个列表元素中都有20个元素
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
Notice on line 38, that you are re-adding the same instance of 神秘 that you instantiated on line 31. C# (like Java) passes objects by reference, not by value (like C and C++).
什么 that effectively means is that all your dictionary entries in kvp are referring to the same object.

再次,请与我们分享您的真实代码,而不是您的代码草图。

I don't think that this will compile: mylist.count . Note that "count" with a lower case 'c' is not a field of a 列表<T>.

Nor will this generate a valid executable: void main(). Note that this should be static void Main().

I highly doubt that anything is actually getting added into kvp because mylist will be empty, and therefore the for loop on line 33 will never be entered.
 
Last edited:

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
Your calculate() returns a new list. Unfortunately, the way it is currently written in post #17, it won't compile. And even if it compiled, it will return an empty list because the for loop will never be entered.
 
最佳 底部