We help IT Professionals succeed at work.

how to FindAll in a generic list ?

nisarkhan
nisarkhan asked
on
678 Views
Last Modified: 2012-05-05
Error      5      Argument '1': cannot convert from 'anonymous method' to 'System.Predicate<People>'

 i have a search page which have 5 dropdownlist and two text-box and i have a gridview so basically it's a search page and user can select any of those ddl or text box and click on search to populate the gridview.

i have come-up with the below code and just thinking what is the best way or pattern to achieve what i want to achieve?

here is i want: FINDALL in the custom business object... any thoughts?

ps: do i need to add pass 7 parameters? because i have 7 controls on the page

public static List<People> GetData(int id)
{
List<People> peoples = new List<People>();
 
peoples.Add(new People(1, "Bart", "Long", "Mower", 10.00M, 18));
peoples.Add(new People(2, "Al", "Short", "Garbage Man", 18.00M, 23));
peoples.Add(new People(3, "Phil", "Short", "Construction", 23.50M, 22));
.....
....  
 
if (id != 0) //new code
{
List<People> peoples1 = new List<People>();
People people = new People();
people = peoples.Find(delegate(People p) { return p.Key == id; }); //error:
peoples1.Add(people);
return peoples1;
}
 
return peoples;
}
 
 
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetData" TypeName ="DataAccess" CacheDuration="300" CacheExpirationPolicy="Sliding">
<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" ConvertEmptyStringToNull="true" PropertyName="Text" Name="id" Direction="Input" Type="int32" />
</SelectParameters>
</asp:ObjectDataSource>

Open in new window

Comment
Watch Question

Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
You can utilize the functions of System.Array like FindAll and pass in different Predicate delegate based on which value you want to search on.

So basically, if I send name "Bart", I would need a function that takes in a People object or String and correctly returns true or false based on existing People objects in List then same for other fields.  Using the Predicate method allows you to use the same array/list and do different matches based on what you pass to call of Array.FindAll.

Here is an example:
http://blogs.msdn.com/rfarber/archive/2006/07/28/681578.aspx

Here is official MSDN on List.FindAll since technically you can do right from List itself:
http://msdn.microsoft.com/en-us/library/fh1w7y8z(VS.80).aspx

Here is the one for Array.FindAll:
http://msdn.microsoft.com/en-us/library/1kkxfxdd(VS.80).aspx
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
And I apologize, must be a lack of coffee as I see you already implemented the Predicate approach with Find and had a question on changing approach due to the 7 controls.

You can take what I was saying about the different Predicate match methods I think to get it to work as the Predicate must take exactly one parameter of the same type as your array, so you would just use different Predicate methods to implement your different match logic based on different fields.

Author

Commented:
can you show me the example of how i will be implemeting?
thanks
Kevin CrossChief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011

Commented:
Think you just need this:

{The say Name is another property of People, you can have a GetDataByName(String name)}
if (id != 0) //new code
{
   return peoples.FindAll
   (
        delegate(People p) 
        { 
            return (p.Key == id); // your original code looks right
            // added paranthesis only for clarity...
        }
    );
}
 
// ...
 
   return peoples.FindAll
   (
        delegate(People p) 
        { 
            return (String.Compare(p.Name, name); 
        }
    );

Open in new window

Author

Commented:
i'm still not sure about the above code

let say i have parameters
id,
name
date

if all three parameters passed then how your code will handle ?

i see that the above code you doing "return after every parameter per say (id, name)

make sense?
Chief Technology Officer
CERTIFIED EXPERT
Most Valuable Expert 2011
Commented:
This one is on us!
(Get your first solution completely free - no credit card required)
UNLOCK SOLUTION

Author

Commented:
interesting let me try and get back to you.
thanks for reply.
Unlock the solution to this question.
Join our community and discover your potential

Experts Exchange is the only place where you can interact directly with leading experts in the technology field. Become a member today and access the collective knowledge of thousands of technology experts.

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.