2016-08-15 114 views
-1

我们有列表A,其中包含随机索引。我有另一个列表B,其中包含类对象。我想用列表A中存在的索引解析列表B,并使用Linq找到名称为Amar的对象。Linq在C#中查询以获取关于列表的元素集合

例如:

List<int> Indexes = new List<int>(); // This contains the random indexes 
List<Student> StuObj = new List<Student>(); 

Class Student 
{ 
    String name; 
} 

现在我想分析列表StuObj一起出现在列表Indexes索引的尊重,并获得在列表StuObj其中名称为AmarStudent对象的索引。

+0

你能提供一些代码并举一些例子吗?你有什么类的对象?你真的需要使用Linq吗? –

+0

你是说你想在StuObj中找到元素: StuObj中元素的索引是索引 AND 学生的名字是Amar? –

回答

1

你可以使用Linq来做到这一点。该Where具有提供该元素的索引过载:

List<int> indexes = new List<int>() { 5, 1 , 10, 30 }; 

var results = listB.Where((item, index)=> indexes.Contains(index) 
             && item.Name == "Amar") 
        .Select(x => listB.IndexOf(x)).To‌​List(); 

编辑:获得元素的索引原listB,你可以使用IndexOf(T)方法。

+0

如何获取对象的索引而不是对象 –

+0

@ G.T。那么你可以用'.Select(x => listB.IndexOf(x))替换'.ToList()'。ToList();' – user3185569

+0

@ G.T。你接受了一个可以产生错误结果的答案。 '.Select((item,index)=> index)'选择过滤后的集合的索引,所以你总是会得到0,1,2,3等...直到元素的数量。 – user3185569

0

事情是这样的:

var result = listA 
    .Where(i => i >= 0 && i < listB.Count) 
    .Select(i => listB[i]) 
    .FirstOrDefault(b => b.Name == "Amar"); 

基本上你使用值从listA作为listB的元素的索引。如果您确定listA仅包含有效索引,则可以删除Where调用。

编辑:按照更新的问题,答案是更容易:

var result = listA 
    .Where(i => i >= 0 && i < listB.Count && listB[i].Name == "Amar") 
    .ToList(); 

我看绝对没有理由使用线性搜索(因此慢)方法ContainsIndexOf像其他答案建议。

indexList.Select(i => dataList[i]); 

你应该考虑你希望发生,如果indexList包含一个整数< 0或>的大小是什么:

0

假设你有两个列表,列表indexList和列表DataList控件,您可以按以下方式使用选择数据列表。例如,你可以用空代替无效的项目,如:

indexList.Select(i => i < 0 || i >= dataList.Count ? null : dataList[i]); 

或者你也可以筛选出来,如:

indexList.Where(i => i>=0 && i < dataList.Count).Select(i => dataList[i]); 

或者你可以通过先决条件知道你将永远不会有索引项列表超出有效值范围。

编辑 基于更新的问题,试试这个:

dataList.Where((item, index) => indexList.Contains(index) && item.Name == "Amar") 
    .Select(item => dataList.IndexOf(item)); 

这需要选择凡属拿项目的索引重载的优势。 Where子句选择dataList中的项目索引位于indexList中的项目,以及项目的名称为Amar的项目。 Select子句然后返回原始数据列表中项目的索引。

+0

这给出了错误的结果,因为最后一次select会在已过滤列表中产生索引。 – user3185569

+0

你是对的,谢谢。修复了使用IndexOf的代码 –

0

这应该工作:

var result = Indexes 
    .Select(i => StuObj[i]) 
    .Where(s => s.name = "Amar").ToList() 

它执行快速索引查找来获取所需的唯一对象。如果您知道只有一条记录,则可以使用FirstFirstOrDefault而不是ToList