Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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#_Linq - Fatal编程技术网

C# 在两个列表中找到差异后返回元素的索引

C# 在两个列表中找到差异后返回元素的索引,c#,linq,C#,Linq,我想找出两个字符串列表之间的差异,并返回列表1中其余元素的索引(在原始列表中) 例如,如果列表1包含“Orange”、“Blue”、“Yellow”,而列表2包含“Blue”,那么我可以使用Except方法轻松获得差异。但是,在这种情况下,我想返回索引-1和3。请原谅列表创建的惰性: var x = new[] { "Orange", "Blue", "Yellow" }.ToList(); var y = new[] { "Blue" }.ToList(); var indices = x.

我想找出两个字符串列表之间的差异,并返回列表1中其余元素的索引(在原始列表中)


例如,如果列表1包含“Orange”、“Blue”、“Yellow”,而列表2包含“Blue”,那么我可以使用Except方法轻松获得差异。但是,在这种情况下,我想返回索引-1和3。

请原谅列表创建的惰性:

var x = new[] { "Orange", "Blue", "Yellow" }.ToList();
var y = new[] { "Blue" }.ToList();

var indices = x.Except(y).Select(z => x.IndexOf(z));

这根本不是很有效,但它解决了问题。如果这真的是为了一些有用的东西,而不仅仅是一个心理练习,我会重新评估你为什么要这么做。

请原谅列表创建的懒惰:

var x = new[] { "Orange", "Blue", "Yellow" }.ToList();
var y = new[] { "Blue" }.ToList();

var indices = x.Except(y).Select(z => x.IndexOf(z));
list1.Select((e,idx) => new { e, idx })
.Where(x => !list2.Contains(x.e)).Select(x => x.idx);

这根本不是很有效,但它解决了问题。如果这实际上是为了一些有用的东西,而不仅仅是一个心理练习,我会重新评估你为什么要这样做。

你可以使用
ExceptBy
基于给定项的投影执行一个except,允许你首先将每个集合投影到一个包含其索引的项中,然后根据项目本身执行“除外”:

list1.Select((e,idx) => new { e, idx })
.Where(x => !list2.Contains(x.e)).Select(x => x.idx);
var query = first.Select((index, item) => new { index, item })
    .ExceptBy(second.Select((index, item) => new { index, item }),
        pair => pair.item);

公共静态IEnumerable ExceptBy(
这是一个数不清的来源,
我是数不清的其他人,
Func键选择器,
IEqualityComparer比较器=空)
{
比较器=比较器??相等比较器。默认值;
var keys=newhashset(其他.Select(keySelector)、comparer);
foreach(源中的var项)
如果(键添加(键选择器(项)))
收益回报项目;
}

您可以使用
ExceptBy
基于给定项的投影执行除,允许您首先将每个集合投影到包含其索引的项中,然后基于项本身执行除:

var query = first.Select((index, item) => new { index, item })
    .ExceptBy(second.Select((index, item) => new { index, item }),
        pair => pair.item);

公共静态IEnumerable ExceptBy(
这是一个数不清的来源,
我是数不清的其他人,
Func键选择器,
IEqualityComparer比较器=空)
{
比较器=比较器??相等比较器。默认值;
var keys=newhashset(其他.Select(keySelector)、comparer);
foreach(源中的var项)
如果(键添加(键选择器(项)))
收益回报项目;
}

解决此问题的其他方法:

var x = new[] { "Orange", "Blue", "Yellow" };
var y = new HashSet<string>(new[] { "Blue" });
var indices = Enumerable.Range(0, x.Length)
                        .Where(i => !y.Contains(x[i]))
                        .ToArray();
var x=new[]{“橙色”、“蓝色”、“黄色”};
var y=新哈希集(新[]{“蓝色”});
var指数=可枚举范围(0,x.Length)
其中(i=>!y.包含(x[i]))
.ToArray();

解决此问题的其他方法:

var x = new[] { "Orange", "Blue", "Yellow" };
var y = new HashSet<string>(new[] { "Blue" });
var indices = Enumerable.Range(0, x.Length)
                        .Where(i => !y.Contains(x[i]))
                        .ToArray();
var x=new[]{“橙色”、“蓝色”、“黄色”};
var y=新哈希集(新[]{“蓝色”});
var指数=可枚举范围(0,x.Length)
其中(i=>!y.包含(x[i]))
.ToArray();

为什么要调用ToList?如果列表不小,那么它的伸缩性会非常糟糕。数组没有
IndexOf
方法。这是一个可怕的想法,但不确定是否有更好的方法严格使用Linq。你为什么要调用ToList?如果列表不小,这将非常可怕。数组没有
IndexOf
方法。这是一个可怕的想法,但不确定是否有更好的方法严格使用Linq。如Jaime的解决方案,这种扩展非常可怕。您可以将
list2
转换为
HashSet
,就像Jaime的解决方案一样,这种扩展非常可怕。您可以将
list2
转换为
HashSet