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

时间:2014-06-10 17:26:27

标签: c# linq

我想找到两个字符串列表之间的区别,并返回list1中剩余元素的索引(在原始列表中)。

例如,如果list1包含" Orange"," Blue"," Yellow",而list2包含" Blue",我可以使用Except方法轻松获得差异。但是,我想在这种情况下返回索引 - 1和3。

4 个答案:

答案 0 :(得分:3)

请原谅列表创建的懒惰:

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

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

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

答案 1 :(得分:1)

list1.Select((e,idx) => new { e, idx })
.Where(x => !list2.Contains(x.e)).Select(x => x.idx);

答案 2 :(得分:0)

您可以使用ExceptBy根据给定项目的投影执行except,允许您首先将每个集合投影到包含其索引的项目中,然后根据项目本身执行except: / p>

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

public static IEnumerable<TSource> ExceptBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    IEnumerable<TSource> other,
    Func<TSource, TKey> keySelector,
    IEqualityComparer<TKey> comparer = null)
{
    comparer = comparer ?? EqualityComparer<TKey>.Default;
    var keys = new HashSet<TKey>(other.Select(keySelector), comparer);
    foreach (var item in source)
        if (keys.Add(keySelector(item)))
            yield return item;
}

答案 3 :(得分:0)

解决问题的其他方法:

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();