2014-11-06 78 views
0

我有以下两个列表的indexOf数组使用LINQ除了

List<String> list1 = new List<String>(); 
list1.Add("one"); 
list1.Add("two"); 
list1.Add("three"); 
list1.Add("four"); 
list1.Add("five"); 

List<String> list2= new List<String>(); 
list2.Add("one"); 
list2.Add("two"); 
list2.Add("three"); 

IEnumerable<int> indexOfUnwantedColumns; 
indexOfUnwantedColumns = list1.Except(list2) 
           .Select((p, i) => new { Item = p, Index = i }) 
           .Select(p => p.Index); 

正如预期的那样,这将给予两项指标在新的清单(0和1)。我希望能够从原来的列表那里指数值(3,4)

任何帮助,将不胜感激

+0

怎么办'headers'和'placeHolders'涉及到'list1'和'list2'。 – 2014-11-06 12:50:05

+0

我的错误,我改变了linq语句中的名字 – 2014-11-06 12:53:53

回答

0

主要思想是之前捕捉到原始索引筛选,然后检查list2是否包含每个项目。为了能够有效地执行这些查找(每查找O(1)聚集的时间),你应该使用一个HashSet:

var hashset = new HashSet<string>(list2); 
var unwantedColIndexes = list1 
    .Select((item, idx) => new { item, idx }) // capture the original index 
    .Where(i => !hashset.Contains(i.item))  // filter using the hashset 
    .Select(i => i.idx)      // get the index only 
    .ToList(); 
0

这是一个简单的方法:

IEnumerable<int> indexOfUnwantedColumns = list1 
    .Select((str, index) => new {str, index}) 
    .Where(x => !list2.Contains(x.str)) 
    .Select(x => x.index); 

一个更有效的方法大序列使用Enumerable.Join(“左外部联接”):

var l1Cols = list1.Select((str, index) => new {str, index}); 
var l2Cols = list2.Select((str, index) => new {str, index}); 
IEnumerable<int> indexOfUnwantedColumns = 
      from c1 in l1Cols 
      join c2 in l2Cols on c1.str equals c2.str into gj 
      from outerJoin in gj.DefaultIfEmpty() 
      where outerJoin == null 
      select c1.index;