开发者

Compare List<string> and enable the required control

开发者 https://www.devze.com 2023-04-07 15:36 出处:网络
I am having two list<string> as follows listA is having the following values 10,20,30,40and listB is having the following values 10,20,30

I am having two list<string> as follows

listA is having the following values 10,20,30,40 and

listB is having the following values 10,20,30

If listB contains listA elements i would like to enable particular controls if not i would like to disable the Controls

I tried of using two loops as follows

for(int ilist1=0;ilist1<listA.count;ilist1++)
{
  for(int ilist2=0;ilist2<listB.count;ilist2++)
  {
      if(listA[ilist1]==listB[ilist2])
      {
           //Enable particular control
      }
  }
}

But i know this is not an appropriate one to do so can any one tell me the 开发者_StackOverflowbest approach to achieve this


What you want to do is to hash the items in the first list into a set then verify for each item in the second is within the set. Unfortunately the HashSet<> is not available so the closest you can get is the Dictionary<,>.

Do this:

Dictionary<string, string> set = new Dictionary<string, string>();
foreach (string item in listA)
{
    set.Add(item, item);
}

foreach (string item in listB)
{
    if (!set.ContainsKey(item))
    {
        //Enable particular control
    }
}


It's easy by using the Intersect method:

    if (listB.Intersect(listA).Count() > 0)
    {
        //enable Control
    }
    else
    {
        //disable control
    }


I think you are looking for something like this

List<string> lista = new List<string>() {"10","40","30" };
List<string> listb = new List<string>() { "10", "20" };

var diff = listb.Except<string>(lista);

diff should give you the ones which didn't match else all would have been matched.

For 2.0

if (listb.TrueForAll(delegate(string s2) { return lista.Contains(s2); }))
                MessageBox.Show("All Matched");
            else
                MessageBox.Show("Not Matched");


In fx 2.0, you can do it like this:

    string b = listA.Find(delegate(string a) { return listB.Contains(a); });
    if (string.IsNullOrEmpty(b))
    {
        //disable control
    }
    else
    {
        //enable control
    }


Control.Enabled = listB.Intersect(listA).Any()

Note that Any() will only check to see if there is at least one item. Count() > 0 will evaluate the entire collection when you only need to check if there is at least one item

Edit: If you are in a .NET 2.0 environment then you can loop through and do this:

foreach (int item in listB)
{
    if (listA.Contains(item))
       return true;
}

return false;
0

精彩评论

暂无评论...
验证码 换一张
取 消