如何使用LINQ从一个列表中获取基于另一个列表的元素。我有两个列表:List lstA和List lstB
伪声明:
public class A
{
string strTag;
int iCounter;
string strInfo;
}
public class B
{
string strTag;
int iIndex;
DateTime? dtTimeStamp;
string strCustomerID,
string strCustomerName;
}
两个列表都包含strTag元素。我想从lstB收集元素,其中strTag元素包含在lstA中。
我在考虑像
这样的东西var newList =
from t in lstB
join s in lstA on t.strTag equals s.strTag into TempData
from r in TempData select r;
澄清:lstB包含数千条记录,lstA包含1-25条记录。我需要来自lstB的1-25条记录,其中strTag与lstA中记录中的strTag匹配
答案 0 :(得分:1)
我使用匿名类型实现它:
var newList = from t in lstB
join s in lstA on t.strTag equals s.strTag
select new {B = t, A = s};
答案 1 :(得分:0)
Where()
和Contains()
的组合应该可以解决问题:
var listA = new[]{"1", "2", "3"}.Select(s => new A{strTag = s});
var r = new Random();
//list of 100 items containing random values between "1" and "100" for strTag
var listB = Enumerable.Range(1,100).Select(i => new B{ strTag =r.Next(1,11).ToString()});
var filtered = listB.Where(b => listA.Select(a => a.strTag).Contains(b.strTag));
答案 2 :(得分:0)
您必须在列表中获取strTag
并使用Contains
过滤掉匹配的记录。试试这样的事情,
List<A> lstA = new List<A>();
List<B> lstB = new List<B>();
List<string> strTagsinA = lstA.Select(x => x.strTag).ToList();
var result = (from b in lstB
where strTagsinA.Contains(b.strTag)
select b).ToList();
答案 3 :(得分:0)
实际上加入列表没有任何问题。问题是在其中一个列表中,在strTag的末尾插入了一个空白字符。
感谢您的建议。我已经尝试了很多,当删除空白字符时,它也会给出正确的结果。
答案 4 :(得分:0)
试试这个
lstA.Join(lstB, a => a.strTag, b => b.strTag, (a, b) => b);