有2个ArrayList如下 ArrayList al1 = new ArrayList();
ArrayList al2 = new ArrayList(); al1.Add("a");
al1.Add("b");
al1.Add("c");
al1.Add("d"); al2.Add("a");
al2.Add("c");
al2.Add("zz");
al2.Add("a");
al2.Add("b");
al2.Add("a");
al2.Add("c");
现要求al1根据al2的值构建al3,当al1的值在al2中出现过2次或以上的,那么这个值就会被去掉:
如这个例子中a和c在al2中出现了2次或以上,就会被去掉,最后的结果应是 b,dal1和al2都比较大,请教该如何有效的写这个函数?
ArrayList al2 = new ArrayList(); al1.Add("a");
al1.Add("b");
al1.Add("c");
al1.Add("d"); al2.Add("a");
al2.Add("c");
al2.Add("zz");
al2.Add("a");
al2.Add("b");
al2.Add("a");
al2.Add("c");
现要求al1根据al2的值构建al3,当al1的值在al2中出现过2次或以上的,那么这个值就会被去掉:
如这个例子中a和c在al2中出现了2次或以上,就会被去掉,最后的结果应是 b,dal1和al2都比较大,请教该如何有效的写这个函数?
对于每个al1中的元素,如果al2中包含,则al2中remove掉这个元素,再次判断是否包含,如果包含则remove掉al1中的这个元素。或者先排序一下 然后
ArrayList al1 = new ArrayList() { "a", "b", "c", "d" };
ArrayList al2 = new ArrayList() { "a", "c", "zz", "a", "b", "a", "c" };
ArrayList rst = new ArrayList(); al2.Sort();
int index = 0;
foreach (var n in al1)
{
index = al2.IndexOf(n);
if (index == -1 || index == al2.Count || al2[index + 1] != n)
rst.Add(n);
}
static void Main(string[] args)
{
ArrayList al1 = new ArrayList();
ArrayList al2 = new ArrayList(); al1.Add("a");
al1.Add("b");
al1.Add("c");
al1.Add("d"); al2.Add("a");
al2.Add("c");
al2.Add("zz");
al2.Add("a");
al2.Add("b");
al2.Add("a");
al2.Add("c"); var different = al2.Cast<string>().Intersect(al1.Cast<string>()).Distinct();
var other = al2.Cast<string>().Except(different).Concat(different).OrderBy(s => s);
other.ToList().ForEach(s => Console.WriteLine(s));
Console.ReadKey();
}
同楼上代码:
static void Main(string[] args)
{
ArrayList al1 = new ArrayList();
ArrayList al2 = new ArrayList(); al1.Add("a");
al1.Add("b");
al1.Add("c");
al1.Add("d"); al2.Add("a");
al2.Add("c");
al2.Add("zz");
al2.Add("a");
al2.Add("b");
al2.Add("a");
al2.Add("c"); var different = al2.Cast<string>().Intersect(al1.Cast<string>()).Distinct();
var other = al2.Cast<string>().Except(different).Concat(different).OrderBy(s => s);
other.ToList().ForEach(s => Console.WriteLine(s));
Console.ReadKey();
}
//lambda
al1.Cast<string>()
.Where(s => al2.Cast<string>()
.Count(a => a == s) <= 1)
.ToList()
.ForEach(s => Console.WriteLine(s));