我有一个包含成员详细信息的通用列表,我有一个成员字符串数组。我需要过滤列表并获取包含所有memberIds的结果。如何使用LINQ实现此目的。
我尝试了以下
string[] memberList = hdnSelectedMemberList.Value.Split(',');
_lstFilteredMembers = lstMainMembers.Where(p =>memberList.Contains(p.MemberId))
.ToList();
但是上面的查询只给出了与第一个成员ID匹配的结果。如果我在memberList数组中有memberIds 1,2,3,4,那么它就是我在查询中只包含它后返回的结果成员ID为1的成员虽然实际列表中有1,2,3,4,5 ..
你能指导我做错了吗。
感谢您的反馈。
答案 0 :(得分:5)
字符串会生成 可怕的 主键。尝试修剪列表:
string[] memberList = hdnSelectedMemberList.Value
.Split(',')
.Select(p => p.Trim())
.ToList();
_lstFilteredMembers = lstMainMembers.Where(p => memberList.Contains(p.MemberId)).ToList();
因为我有一种感觉hdnSelectedMemberList
可能是"1, 2, 3, 4"
。
答案 1 :(得分:1)
使用联接:
var memquery = from member in lstMainMembers
join memberid in memberList
on member.MemberId equals memberid
select member;
答案 2 :(得分:0)
尝试Enumerable.Intersect
获取两个集合的交集:
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.intersect.aspx
_lstFilteredMembers = lstMainMembers.Intersect(memberList.Select(p => p.MemberID.ToString())).ToList()
答案 3 :(得分:0)
为什么不将ID列表投射到成员列表中?
var result = memberList.Select(m => lstMainMembers.SingleOrDefault(mm => mm.MemberId == m))
当然,这将为您提供一个列表,其中包含不匹配的项目的空条目。
如果您愿意,可以过滤掉那些......
result = result.Where(r => r != null)
或者您可以在初始选择之前过滤它...
memberList.Where(m => lstMainMembers.Any(mm => mm.MemberId == m)).Select(m => lstMainMembers.Single(mm => mm.MemberId == m))
但这很难看。
答案 4 :(得分:0)
使用jmh,我会使用连接
var members = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var ids = new[] { 1, 3, 6, 14 };
var result = members.Join(ids, m => m, id => id, (m, id) => m);
foreach (var r in result)
Console.WriteLine(r); //prints 1, 3, 6
答案 5 :(得分:0)
您显示的代码是正确的,并且在单元测试中工作:
public class Data
{
public string MemberId { get; set; }
}
[TestMethod]
public void Your_Code_Works()
{
// Arrange fake data.
var hdnSelectedMemberList = "1,2,3,4";
var lstMainMembers = new[]
{
new Data { MemberId = "1" },
new Data { MemberId = "2" },
new Data { MemberId = "3" },
new Data { MemberId = "4" },
new Data { MemberId = "5" }
};
// Act - copy/pasted from StackOverflow
string[] memberList = hdnSelectedMemberList.Split(',');
var _lstFilteredMembers = lstMainMembers.Where(p => memberList.Contains(p.MemberId)).ToList();
// Assert - All pass.
Assert.AreEqual(4, _lstFilteredMembers.Count);
Assert.AreEqual("1", _lstFilteredMembers[0].MemberId);
Assert.AreEqual("2", _lstFilteredMembers[1].MemberId);
Assert.AreEqual("3", _lstFilteredMembers[2].MemberId);
Assert.AreEqual("4", _lstFilteredMembers[3].MemberId);
}
除了您所展示的内容之外,您的代码一定有问题。