我有一些列表,例如:
List Vars<string>
List Units<string>
必须与以下内容进行比较:
List vars<string>
List units<string>
现在,问题是,我还必须存储这些差异所在的索引,例如:
Vars = 1, 2, 4, 5
vars = 1, 4, 2, 6
在这种情况下,我需要从第一个列表中存储5(必须将其更改为6)。
我确实找到了如何分辨它们之间是否存在差异的方法,但是我无法真正获得它们位于自己列表中的索引。
var unitsDifferences = Units.Except(unit).Union(unit.Except(Units)).ToList();
如上例所示,列表的排列顺序不同,有时第一个列表的第一个元素位于第二个列表的末尾,反之亦然,因此使用for或其他循环会非常慢,尤其是我必须研究数千个元素。
我对C#相当陌生,非常感谢您提供的任何帮助。
编辑:
var firstDiff = TXTHandler.unit
.Select((i, v) => new { Index = i, Value = v })
.Where(p => !setVars.Contains(p.Value.ToString()))
.Select(p => p.Index)
.ToList(); //
Console.WriteLine(String.Join(",", setVars));
打印值,而不是它们的索引。
您可以使用进行操作FirstOrDefault
,如下所示:
// This is inefficient
var firstDiff = vars
.Select((v, i) => new {Index = i, Value = v}) // Pair up values and indexes
.FirstOrDefault(p => !Vars.Contains(p.Value)) // Pick first missing value
?.Index; // Select index using ?. because FirstOrDefault could return null
为了提高效率,请首先构建一个集合Vars
。这将使算法为O(n)而不是O(n 2):
var setVars = new HashSet<string>(Vars);
var firstDiff = vars
.Select((v, i) => new {Index = i, Value = v})
.FirstOrDefault(p => !setVars.Contains(p.Value))
?.Index; // ^^^^^^^
如何获得所有差异的索引?
替换FirstOrDefault
为Where
和Select
:
var setVars = new HashSet<string>(Vars);
var allDiffs = vars
.Select((v, i) => new {Index = i, Value = v})
.Where(p => !setVars.Contains(p.Value))
.Select(p => p.Index)
.ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句