arraylist中所有不常见元素的列表

时间:2013-04-29 03:43:33

标签: asp.net arraylist c#-2.0 icomparer

我有2个ArrayList,其中包含文件名,现在一个列表有更多名称,其他可能有更少,或者有时相等,我想列出两个arraylist中不常见的文件名,因此更新数据库,我是能够检查它们是否相等,但我无法列出哪个列表有额外的元素,哪些是它们。

这是我目前正在使用的代码。

 ArrayList DatabaseSavedThumbnail = objSlideShow.GetAllThumbnailBySlideShowId();
        string[] FolderSavedThumbnail = Directory.GetFiles(Server.MapPath("~/Portals/2/SlideShowThumbnails/" + SlideShowName));

        if (Directory.GetFiles(Server.MapPath("~/Portals/2/SlideShowThumbnails/" + SlideShowName)).Length > 0)
        {
            if (!Object.Equals(DatabaseSavedThumbnail, FolderSavedThumbnail))
            {
                for (int i = 0; i < DatabaseSavedThumbnail.Count && i < FolderSavedThumbnail.Length; i++)
                {
                    if (!object.Equals(DatabaseSavedThumbnail[i], FolderSavedThumbnail[i]))
                    {
                        if (DatabaseSavedThumbnail.Count > FolderSavedThumbnail.Length)
                        {
                            objSlideShow.Thumbnail = "/Portals/2/SlideShowThumbnails/" + SlideShowName + "/" + Path.GetFileName(DatabaseSavedThumbnail[i].ToString());
                        }
                        else
                        {
                            objSlideShow.Thumbnail = "/Portals/2/SlideShowThumbnails/" + SlideShowName + "/" + Path.GetFileName(FolderSavedThumbnail[i].ToString());
                        }
                    }
                    Response.Write(objSlideShow.Thumbnail + "<br>");
                    /*objSlideShow.SlideTitle = String.Empty;
                    objSlideShow.SlideDescription = string.Empty;
                    objSlideShow.AddSlide();*/
                }
            }
        }

但是这列出了arraylist中包含更多元素的所有元素,我只想要差异元素,这样我就可以用这些元素更新数据库了。

任何人都可以告诉我如何获得比较2个数组列表的差异记录。

2 个答案:

答案 0 :(得分:1)

尝试使这些元素在两个列表中都不常见(假设DatabaseSavedThumbnail有字符串):

using System.Linq;
...
...
var dstArray = DatabaseSavedThumbnail.ToArray(typeof(string));
var fstArray = FolderSavedThumbnail;

var notCommonElements = dstArray.Union(fstArray).Except(dstArray.InterSect(fstArray));

一种非常天真的迭代方法可以是:

private IEnumerable<string> GetNotCommonElements(string[] array1, string[] array2)
{
    foreach (var item in array1)
    {
        if (!array2.Contains(item))
        {
            yield return item;
        }
    }

    foreach (var item in array2)
    {
        if (!array1.Contains(item))
        {
            yield return item;
        }
    }
}

然后使用它:

foreach(var item in GetNotCommonElements(dstArray, fstArray))
{
   // Do stuff with item
}

答案 1 :(得分:0)

你可以从这个

获得想法
List<int> intersection = first.Cast<int>().Intersect(second.Cast<int>()).ToList();

ArrayList intersection = new ArrayList();
foreach (var i in first.Cast<int>().Intersect(second.Cast<int>()))
    intersection.Add(i);

更多细节
Two ArrayList manipulation