1

我学习 LINQ,我想使用挂起的请求,但我有这个问题

            List<string> _strs = new List<string> { "1", "2", "1", "1", "0" };
            var selind = _strs.Select((name, ind) => new { indexname = name, index = ind }).Where(o => o.indexname == "1");
            string sind = "";
            foreach (var item in selind)
                sind += item.index.ToString() + " ";
            //i get 0 2 3 
            _strs.Add("2");
            _strs.Add("1");
            sind = "";
            foreach (var item in selind)
                sind += item.index.ToString() + " ";
            //Good, i get 0 2 3 6
            _strs = new List<string>() { "1" };
            sind = "";
            foreach (var item in selind)
                sind += item.index.ToString() + " ";
            //Why i get again 0 2 3 6

好的,我明白为什么,但我想知道两件事:

  • 我应该如何清除内存?

    selind = null; 或者你能告诉我更好的方法吗?

  • 在完全重建 _strs 后与 selind 一起工作,我找到了两种方法

            _strs.Clear();
            _strs.Add();
    

或再次致电

selind = _strs.Select((name, ind) => new { indexname = name, index = ind }).Where(o => o.indexname == "1");

你能告诉我另一种方式吗?

提前致谢!

4

1 回答 1

2

您的查询:

_strs.Select((name, ind) => new { indexname = name, index = ind }).Where(o => o.indexname == "1");

绑定到内存中的特定列表引用(无论_strs当时是什么),而不是特定的变量名。它们不是同一件事。当你这样做时:

_strs = new List<string>() { "1" };

您没有清除_strs最初指向的内存引用。相反,您让该变量名称指向一个新的内存位置。而_strs.Clear()确实清除了原始列表。

您的问题的最佳解决方案是将 LINQ 查询包装在一个接受列表的函数中,这样您就可以在新列表上再次调用它而无需再次键入它。或者,根据您的用例,只需.Clear()在需要重新开始时调用。

(如果不清楚,对曾经指向_strs = null的列表没有任何作用_strs,它只会使特定的变量名无效)

于 2012-05-04T07:13:15.923 回答