If your lists are more than non-trivial in size, avoid
O(n * m) algorithms.
This one is only
O(n + m).
(Borrowing the value setup from jinesh's Solution.)
List<Reader> lstreader = new List<Reader>()
{ new Reader { ReaderId=1,ReaderName="A"},
new Reader { ReaderId=2,ReaderName="B"},
new Reader { ReaderId=3,ReaderName="C"},
new Reader { ReaderId=4,ReaderName="D"}
};
DataTable dt = new DataTable();
dt.Columns.Add("ReaderId", typeof(int));
dt.Columns.Add("ReaderName", typeof(string));
dt.Rows.Add(5, "E");
dt.Rows.Add(6, "F");
dt.Rows.Add(2, "B");
dt.Rows.Add(3, "D");
var result = lstreader.Except(dt.AsEnumerable().Select(t => t.Field<int>("ReaderId")));
Edit: MTH -- Oops: Not enough thinking,
.Except()
isn't quite correct for this case.
Instead try (this still is
O(n + m)):
var dtReaderIds = dt.AsEnumerable().Select(t => t.Field<int>("ReaderId"));
HashSet<int> excludedIds = new HashSet<int>(dtReaderIds);
IEnumerable<Reader> result = lstreader.Where(r => !excludedIds.Contains(r.ReaderId));