问题 多气词典

JKERTIR.

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


如何在C#中这样做?
 

jmplhinney.

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

sh

众所周知的成员
加入
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.
            }
此Tidyer版本可能更易于阅读:
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)
 

sh

众所周知的成员
加入
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>>>();

您还需要相应更新代码以包含这些更改。 ;)
 

JKERTIR.

成员
加入
4月18日,2020年4月
消息
9
编程经验
1-3
各位,

我有一个问题
<字符串,元组{string,int,list<string>}>

在DICT中约有12名成员。
我需要在一组中组合6个成员,因此创建了两组
这两个组数据需要转储到Excel文件中。

所以我应该去Singleton类或接口,以便在Excel中撰写转储列表的方法。
 
Last edited:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
为什么你认为要么有用吗?单例是特别的,所以永远不会超过你类型的一个实例。在这种情况下有没有理由强加这种限制?使用接口有各种原因,包括可测试性。您是否计划为此类型写入单元测试?如果没有,您是否看到定义接口的其他优势?您将在任何一种情况下在类中实现实例成员,以便您需要某种益处到一个或另一个才能实现。
 

JKERTIR.

成员
加入
4月18日,2020年4月
消息
9
编程经验
1-3
为什么你认为要么有用吗?单例是特别的,所以永远不会超过你类型的一个实例。在这种情况下有没有理由强加这种限制?使用接口有各种原因,包括可测试性。您是否计划为此类型写入单元测试?如果没有,您是否看到定义接口的其他优势?您将在任何一种情况下在类中实现实例成员,以便您需要某种益处到一个或另一个才能实现。
不,我们没有任何具体的原因。我只想构建我的代码
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
然后我既不建议。实施单例不是无缘无故的事情。在您的课程中定义接口并在您的课程中实现它们可能有许多优势,但如果您不会利用任何一个,这只是额外的工作。如果您想要未来证明您的代码,那么您肯定可以实现一个接口,但是您需要确保使用它,否则没有点。如果您必须返回和重新推荐代码以稍后使用接口,则可能等待直到然后才能定义界面。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
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.");
}
 

sh

众所周知的成员
加入
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. valy.item1; 在哪里 价值 是个 元组 在你的字典和 .Item1 如果是第一个值, 价值.item2. 是你的int和 价值.item3. 是你的 列表<string> 并访问其值,但调用列表中的第一个位置<string> by 价值.item3 [0] 来自元组的第三项。

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

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
我同意这应该合并。

元组非常适合快速瞬态数据。它看起来像在特定的用户的情况下,数据挂断了一段时间,他实际上需要做多种操作。此外,来自他的其他线程(设计方法),看起来他知道字典只有12个条目。

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

Dictionary<string, Foo> myData;
 

JKERTIR.

成员
加入
4月18日,2020年4月
消息
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 Count是20(第一个列表中的10个名表中的10个名单中的10个词典中的每个条目中的第一个列表10个字典中的第二个条目中的10个字典中的10个字典中的10个字典中的10个。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,892
地点
切萨皮克,va.
编程经验
10+
如果没有您向我们展示您的实际代码,即如何插入对象,稍后将获得对象的计数,我们所能做的就是推测。例如,现在我推测了您只是回收与您作为元组组成的一部分添加的相同对象列表。
 

约翰

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


如何在C#中这样做?
获取在类结构中组织的分组值,如 @skydiver. 在第12篇文章中展示。保持简单和面向对象。
 

JKERTIR.

成员
加入
4月18日,2020年4月
消息
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,892
地点
切萨皮克,va.
编程经验
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,892
地点
切萨皮克,va.
编程经验
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.
 
最佳 底部