Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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#_C# 4.0_C# 3.0_C# 2.0 - Fatal编程技术网

C# 如何获得链表中数字的索引?

C# 如何获得链表中数字的索引?,c#,c#-4.0,c#-3.0,c#-2.0,C#,C# 4.0,C# 3.0,C# 2.0,我有一个链表,其结构如下: LinkedList<int> linked = new LinkedList<int>(); var array = new int[] { 23, 55, 64, 65 }; foreach (var item in array) { linked.AddLast(item); } LinkedList linked=新建LinkedList(); var数组=新的int[]{23,55,64,65}; foreach(数组中的变

我有一个链表,其结构如下:

LinkedList<int> linked = new LinkedList<int>();
var array = new int[] { 23, 55, 64, 65 };
foreach (var item in array)
{
    linked.AddLast(item);
}
LinkedList linked=新建LinkedList();
var数组=新的int[]{23,55,64,65};
foreach(数组中的变量项)
{
linked.AddLast(项目);
}

如何找到数字64的索引?

我认为您应该使用自己的函数来解析列表并进行检查。“Find”函数只返回第一次出现的值,对于您来说,列表中可能有两次或更多64次出现

唯一的方法是逐个元素检查并增加一个计数器(通过“唯一方法”,我是说像LINQ这样的其他方法需要在内部执行相同的操作)

int index = linked.Select((item, inx) => new { item, inx })
                  .First(x=> x.item == 64).inx;
手写扩展方法如下所示:

public static class LinkedListExt
{
    public static int IndexOf<T>(this LinkedList<T> list, T item)
    {
        var count = 0;
        for (var node = list.First; node != null; node = node.Next, count++)
        {
            if (item.Equals(node.Value))
                return count;
        }
        return -1;
    }
}
公共静态类LinkedListExt
{
公共静态int IndexOf(此LinkedList列表,T项)
{
var计数=0;
for(var node=list.First;node!=null;node=node.Next,count++)
{
if(item.Equals(node.Value))
返回计数;
}
返回-1;
}
}

但是使用LINQ as可以很容易地实现(产生相同的时间复杂度)。

这里有一个替代LINQ实现,它避免创建匿名对象,并在项目不在列表中时返回-1:

int index = linked.Select((n, i) => n == 64 ? (int?)i : null).
            FirstOrDefault(n => n != null) ?? -1;
它将数字序列转换为包含匹配索引的序列,否则将转换为
null
。如果有,则取第一个,否则将默认的
int?
转换为
-1

编辑:

以下是一个更好(更简单、更高效)的替代方案:

int i = linked.TakeWhile(n => n != 64).Count();
i
将等于索引,或等于链接的
。如果未找到值
64
,则计数

您可以编一个。:)我发现这个问题是为了弄清楚如何对链表进行排序。因为我正在对结构进行排序,所以我突然想到,我所要做的就是给每个结构赋予一个唯一的标识符。这可能就是它们被创建的顺序。只需向每个节点添加一个名为seq或idx的int字段。将int改为内部包含int的structs,并附加另一个int字段作为临时索引。遍历列表将很麻烦。但是要将原始int绑定到索引

如果不希望数据四处移动,可以构建指向链接列表元素的指针数组。从头开始,使用指向下一步的指针,继续这样做,并计算跳数。然后分配数组,再次从列表的开头开始,并在数组中记录下下一个指针的地址。但是某人或某物(另一个线程?)可能会通过移动、添加或删除元素而将其搞糟。该列表将继续工作,但阵列需要报废并重新制作。可能相对较快,但如何可靠地检测变化


圆形的?只需使用模so向前移动idx=(idx+1)%N,其中N是字段的总数。对于正常的C来说,我不知道C的限制是什么。

如果你需要一个基于索引的集合,考虑使用<代码>列表< /C>而不是一个链表。你确定 Link KistList适合你的问题吗?是的,我必须使用<代码> Link KistList。但是你能不能用一个简单的句子来详细说明一下@智能男孩:那是linq,并且是可枚举的。
可以合并元素的索引。@TimSchmelter我一定是遗漏了什么。如何从
LinkedList
创建循环链表?@Smartboy:当您使用
Select
扩展方法时,它使用
LinkedList
IEnumerable
实现来简单地迭代元素,一次迭代一个。然后,
Select
方法将每个元素投影到一个具有两个属性的匿名类的新实例中(item value
“item”
,及其索引
“inx”
),然后
首先
方法接受一个指定搜索谓词的匿名方法(取
int
,返回
bool
)并返回满足条件的第一个元素。
First
的一个小问题是,当没有匹配项时,它会抛出一个异常。@TimSchmelter似乎是您自己创建了问题,并对这些问题进行了评论。我认为问题很清楚,我不认为这是OP的问题所在。同样的道理。我指出你的答案是正确的,因为答案应该总是容易理解的,即使是对你来说nerds@Smartboy:谢谢,但是一旦你习惯了LINQ就没那么难了。与手动迭代相比,我更喜欢LINQ,它更简洁。这只是为了展示算法。