Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:按列表索引的词典_C#_List_Dictionary_Indexed - Fatal编程技术网

C#:按列表索引的词典

C#:按列表索引的词典,c#,list,dictionary,indexed,C#,List,Dictionary,Indexed,我试图编写一个程序,其中字典按列表索引。(相信我,我知道,是的,有选择,但我喜欢按列表索引)。有一个最小工作(实际上不工作,只有最后一行是问题)示例: 使用系统; 使用System.Collections.Generic; 名称空间测试 { 班级计划 { 静态void Main(字符串[]参数) { 字典h=新字典(); 列表w=新列表{“a”}; h、 添加(w,1); w=新列表{“b”}; h、 添加(w,2); w=新列表{“a”}; int值=0; h、 TryGetValue(w,输

我试图编写一个程序,其中字典按列表索引。(相信我,我知道,是的,有选择,但我喜欢按列表索引)。有一个最小工作(实际上不工作,只有最后一行是问题)示例:

使用系统;
使用System.Collections.Generic;
名称空间测试
{
班级计划
{
静态void Main(字符串[]参数)
{
字典h=新字典();
列表w=新列表{“a”};
h、 添加(w,1);
w=新列表{“b”};
h、 添加(w,2);
w=新列表{“a”};
int值=0;
h、 TryGetValue(w,输出值);
Console.WriteLine(值+“”+h[w]);
}
}

如果调试这个程序,他会清楚地看到h中有两个元素,但这些元素仍然无法通过正确的索引访问--h[w].我错了吗?还是有什么奇怪的事情发生了?

问题是按列表索引,您索引的不是列表中的数据,而是通过指向列表的内存指针(即此列表所在位置的内存地址)进行索引

您在一个内存位置创建了一个列表,然后在另一个内存位置(即创建新实例时)创建了一个完全不同的列表。这两个列表即使包含相同的数据也不同,这意味着您可以在字典中添加任意数量的数据


一种解决方案不是按列表索引,而是按字符串索引,并使用包含列表中所有数据的逗号分隔列表作为索引。

问题是按列表索引,您索引的不是列表中的数据,而是通过指向列表的内存指针进行索引(即此列表所在位置的内存地址)

您在一个内存位置创建了一个列表,然后在另一个内存位置(即创建新实例时)创建了一个完全不同的列表。这两个列表即使包含相同的数据也不同,这意味着您可以在字典中添加任意数量的数据


一种解决方案不是按列表索引,而是按字符串索引,并使用包含列表中所有数据的逗号分隔列表作为索引。

应用程序的问题源于以下事实:

new List<String> { "a" } != new List<String> { "a" }
新列表{“a”}!=新列表{“a”}
列表的相等性检查两个引用是否引用了同一个实例。在本例中,它们没有引用。相反,您创建了两个具有相同元素的列表…这并不能使它们相等

您可以通过创建自定义相等比较器来解决此问题:

public class ListEqualityComparer<T> : IEqualityComparer<List<T>>
{
    public bool Equals(List<T> list1, List<T> list2)
    {
        return list1.SequenceEquals(list2);
    }

    public int GetHashCode(List<T> list)
    {
        if(list != null && list.Length > 0)
        {
            var hashcode = list[0].GetHashCode();
            for(var i = 1; i <= list.Length; i++)
                hashcode ^= list[i].GetHashCode();

            return hashcode;
        }

        return 0;
    }
}
公共类ListQualityComparer:IEqualityComparer
{
公共布尔等于(列表1、列表2)
{
返回list1.SequenceEquals(list2);
}
public int GetHashCode(列表)
{
if(list!=null&&list.Length>0)
{
var hashcode=list[0]。GetHashCode();

对于(var i=1;i,您的应用程序的问题来自以下事实:

new List<String> { "a" } != new List<String> { "a" }
新列表{“a”}!=新列表{“a”}
列表的相等性检查两个引用是否引用了同一个实例。在本例中,它们没有引用。相反,您创建了两个具有相同元素的列表…这并不能使它们相等

您可以通过创建自定义相等比较器来解决此问题:

public class ListEqualityComparer<T> : IEqualityComparer<List<T>>
{
    public bool Equals(List<T> list1, List<T> list2)
    {
        return list1.SequenceEquals(list2);
    }

    public int GetHashCode(List<T> list)
    {
        if(list != null && list.Length > 0)
        {
            var hashcode = list[0].GetHashCode();
            for(var i = 1; i <= list.Length; i++)
                hashcode ^= list[i].GetHashCode();

            return hashcode;
        }

        return 0;
    }
}
公共类ListQualityComparer:IEqualityComparer
{
公共布尔等于(列表1、列表2)
{
返回list1.SequenceEquals(list2);
}
public int GetHashCode(列表)
{
if(list!=null&&list.Length>0)
{
var hashcode=list[0]。GetHashCode();

对于(VaR i=1;i这将永远不会为您工作,因为<代码>列表<代码> >代码>等于<代码> >代码> GetHashCode <代码>方法不考虑列表的内容。如果您想使用对象集合作为键,则需要实现您自己的集合类型,以覆盖“<代码>等于”的方式来检查均衡器。集合中对象的y(可能使用。)<代码> >列表> <代码> > <代码> > <代码> GetHashCode < /代码>方法不考虑列表中的内容。如果您想使用对象集合作为键,则需要实现您自己的集合类型,以覆盖“<代码>等于< /代码>”的方式来检查O的相等性。集合中的对象(可能使用。)

Dictionary类使用引用比较来查找指定的键,这就是为什么即使列表包含相同的项,它们也会不同。

Dictionary类使用引用比较来查找指定的键,这就是为什么即使列表包含相同的项,它们也会不同。

list类可能不会根据其内容生成哈希代码和相等性检查。您是否检查了数组是否工作得更好?或者可能使用自定义类或
元组
否,数组具有相同的行为。您可能需要自定义IEqualityComparer@LasseV.Karlsen:不会:list类可能不会根据其con生成哈希代码和相等性检查帐篷。你检查过数组是否工作得更好吗?或者可能使用自定义类,或者元组。不,数组具有相同的行为。你可能需要自定义类IEqualityComparer@LasseV.Karlsen:它们不会:在这个特定的上下文中。一般来说,它不会这样做,但是对于一个不覆盖GetHashCode或Equals的列表,它会这样做。在这个spe中cific上下文。通常情况下,它不会这样做,但有一个列表,它不会覆盖GetHashCode或Equals。哦,或者你可以使用
IEqualityComparer
,就像上面评论中的那个人,但我会把它留给其他人。哦,或者你可以使用
IEqualityComparer
,就像上面评论中的那个人一样注意,但我将把它留给其他人。技术上不是指针,但这是正确的。List不计算h