![]() |
#2
afdoa832014-11-10 14:57
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这样的表达式。具体是怎么解释的呢? |
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;
}
}
}