标题:数组比较,继续求解
只看楼主
urick
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-12-6
结帖率:75%
已结贴  问题点数:50 回复次数:3 
数组比较,继续求解
1. 将textbox1-textbox5中的字符组成一个变量数组strs1={a,b,c,d,e};
2. 若常量数组strs2={a1,a2,a3}中的每个元素都存在于strs1中,a1、a2、a3元素所在的文本框背景色变为红色(strs1只包含2个或1个strs2的元素,则该判据失效);
3. 若步骤2的判据生效,则去除strs1中的a1、a2、a3元素,构建一个新的数组newstrs1后,与常量数组strs3={b1,b2}进行比较;若步骤2的判据失效,则将strs1与strs3进行比较;
4. 若数组strs3的每个元素都存在于数组newstrs1或strs1中,则元素所在的文本框背景色变为黄色。




以下是部分源码,但结果与预期不符合,求解,希望可以给出具体源码:


private void button1_Click(object sender, EventArgs e)
        {

            Dictionary<TextBox, string> map = new Dictionary<TextBox, string>();
            List<string> strs1 = new List<string>();
            foreach (Control c in this.Controls)
            {
                if (c is TextBox)
                {
                    map.Add((c as TextBox),(c as TextBox).Text);
                }
            }
            string[] strs2 = { "飞", "行", "器" };
            string[] strs3 = { "飞", "机" };
            foreach (KeyValuePair<TextBox, string> key in map)
            {
                if (strs2.Where(s => s == key.Value).Count() > 0 )
                {
                    key.Key.BackColor = Color.Red;
                }
                if (strs3.Where(s => s == key.Value).Count() > 0)
                {
                    key.Key.BackColor = Color.Yellow;
                }
            }
        }
搜索更多相关主题的帖子: 背景色 文本框 黄色 元素 
2014-11-10 01:56
afdoa83
Rank: 4
等 级:业余侠客
威 望:7
帖 子:43
专家分:262
注 册:2012-7-31
得分:50 
private void button1_Click(object sender, EventArgs e)
{
    Dictionary<TextBox, string> map = new Dictionary<TextBox, string>();
    Dictionary<TextBox, string> mapT1 = new Dictionary<TextBox, string>();
    Dictionary<TextBox, string> mapT2 = new Dictionary<TextBox, string>();

    foreach (Control c in this.Controls)
    {
        if (c is TextBox)
        {
            map.Add((c as TextBox), (c as TextBox).Text);
        }
    }
    //复制map给mapT1,mapT2用于第二组合第三组比较
    foreach (KeyValuePair<TextBox,string> key in map)
    {
        mapT1.Add(key.Key,key.Value);
        mapT2.Add(key.Key,key.Value);
    }
    //模拟常数项            
    string[] s1 = { "1","2","3"};
    string[] s2 = { "3","4","5"};
    string[] s3 = { "4","5"};
   
    //测试标记法
    //使用foreach集合遍历后的标记是倒叙方式
    //应为后续方法都是用foreach遍历,所以倒叙可以忽略
    int[] fl = new int[map.Count()];//标记项
    int k = map.Count();
    int i = 0;//用于记录对比的连续性
    foreach (KeyValuePair<TextBox,string> key in map)
    {
        k--;
        if (s1.Where(s => s == key.Value).Count() > 0)
        {
            i++;
        }
        else { i = 0; }
        if (i == s1.Length)//当i=s1的长度,证明是第一个连续项,并记录在标记项          {
             fl[k] = 1;
             fl[k + 1] = 1;
             fl[k + 2] = 1;
        }
                             
    }
    k = map.Count(); i = 0;
    //根据标记更改
    foreach (KeyValuePair<TextBox, string> key in map)
    {
        k--;
        if (fl[k] == 1)
        {
            key.Key.BackColor = Color.Red;
            mapT1.Remove(key.Key);
            mapT2.Remove(key.Key);
        }
    }
    //第二次判定
    //先清零标记项
    for (int j = 0; j < fl.Length; j++)
    {
        fl[j] = 0;
    }
    //设置初始项,判定标记项
    //如果第一组没执行,那么mapT1=map。如果执行了mapT1就是减值后的键值对。
         
    k = mapT1.Count(); i = 0;
    foreach (KeyValuePair<TextBox, string> key in mapT1)
    {
        k--;
        if (s2.Where(s => s == key.Value).Count() > 0)
        {
            i++;
        }
        else { i = 0; }
        if (i == s2.Length)
        {
            fl[k] = 1;
            fl[k + 1] = 1;
            fl[k + 2] = 1;
        }
    }
    k = mapT1.Count(); i = 0;
    //根据标记更改颜色
    foreach (KeyValuePair<TextBox, string> key in mapT1)
    {
        k--;
        if (fl[k] == 1)
        {
            key.Key.BackColor = Color.Red;
            mapT2.Remove(key.Key);
        }
    }
    //黄色更改标记
    for (int j = 0; j < fl.Length; j++)
    {
        fl[j] = 0;
    }
    //应为要完全包含 我理解为也是需要连续的
    k = mapT2.Count(); i = 0;
    foreach (KeyValuePair<TextBox,string> key in mapT2)
    {
        k--;
        if (s3.Where(s => s == key.Value).Count() > 0)
        {
            i++;
        }
        else { i = 0; }
        if (i == s3.Length)
        {
            fl[k] = 1;
            fl[k + 1] = 1;
            fl[k + 2] = 1;
        }
    }
    k = mapT2.Count(); i = 0;
    //黄色输出
    foreach (KeyValuePair<TextBox, string> key in mapT2)
    {
        k--;
        if (fl[k] == 1)
        {
            key.Key.BackColor = Color.Yellow;                    
        }
    }
 }

测试通过了,代码没有整理,直接把测试的代码发上来了,重复的代码很多。
我也是C#的初学者,对集合的用法理解不深。需要用标记法解决问题。
请教关于String.Where(s => s == key.Value).Count这样的表达式。具体是怎么解释的呢?
2014-11-10 14:57
urick
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-12-6
得分:0 
回复 2 楼 afdoa83
后来用了"intersect"和"Except"的方法来实现的

if (map.Values.Intersect(strs1).Distinct().Count() == strs1.Count())
    {
        Change(map, strs1, Color.Yellow);
        string[] strs1 = map.Values.Except(strs1).ToArray();               
    }

现在出现了个问题,实际运用中由于需判定的条件太多,多次"if"、"else if"已经不能满足了

20个"textbox",如何将背景色为Red的文本框筛选出来??组成一个新的数组,来进行其它条件的判定


[ 本帖最后由 urick 于 2014-11-11 21:43 编辑 ]
2014-11-11 21:39
urick
Rank: 1
等 级:新手上路
帖 子:20
专家分:0
注 册:2012-12-6
得分:0 
问题已解决
2014-11-12 23:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-438356-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.195089 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved