Search code examples
c#.netlinq

In C# LINQ How to keep two separate lists or Data tables based on status data


I have list of ListRecords:

InCorrectNumber CorrectNumber   Status
---------------------------------------
10101010        7003594558      VALID
20202020        7003310682      VALID
2244448         2222222         INVALID
30303030        6130985705      VALID
3434448         1111111         INVALID
8273648         3333333         INVALID

Using Linq, how do I split the values from ListRecords list into 2 different lists?

For example:

ValidList1:

InCorrectNumber CorrectNumber   
------------------------------
10101010        7003594558  
20202020        7003310682  
30303030        6130985705  

InValidValidList1:

InCorrectNumber CorrectNumber
------------------------------
2244448         2222222 
3434448         1111111 
8273648         3333333 

I have tried as shown here - not sure, it's not working working with good performance

List<accounts> openEvents = ValidList1 .Where(e => e.Status == VALID);
List<accounts> closedEvents = InValidValidList1.Where(e => e.Status == INVALID);

Solution

  • Given these definitions:

    public class Account
    {
        public long IncorrectNumber;
        public long CorrectNumber;
        public Status Status;
    }
    
    public enum Status
    {
        VALID, INVALID
    }
    

    And this data:

    List<Account> ListRecords = new List<Account>()
    {
        new Account { IncorrectNumber = 10101010L, CorrectNumber = 7003594558L, Status = Status.VALID },
        new Account { IncorrectNumber = 20202020L, CorrectNumber = 7003310682L, Status = Status.VALID },
        new Account { IncorrectNumber = 2244448L, CorrectNumber = 2222222L, Status = Status.INVALID },
        new Account { IncorrectNumber = 30303030L, CorrectNumber = 6130985705L, Status = Status.VALID },
        new Account { IncorrectNumber = 3434448L, CorrectNumber = 1111111L, Status = Status.INVALID },
        new Account { IncorrectNumber = 8273648L, CorrectNumber = 3333333L, Status = Status.INVALID },
    };
    

    Then using ToLookup is the way to go:

    var lookup = ListRecords.ToLookup(x => x.Status);
    
    List<Account> openEvents = lookup[Status.VALID].ToList();
    List<Account> closedEvents = lookup[Status.INVALID].ToList();
    

    That gives me:

    results