linq c#中的“in”运算符?

时间:2012-02-17 21:02:27

标签: c# linq

我有一个包含成员详细信息的通用列表,我有一个成员字符串数组。我需要过滤列表并获取包含所有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 ..

你能指导我做错了吗。

感谢您的反馈。

6 个答案:

答案 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);
    }

除了您所展示的内容之外,您的代码一定有问题。