0

我有 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 个数组列表的差异记录。

4

2 回答 2

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
}
于 2013-04-29T04:13:39.240 回答
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);

更多细节
两个 ArrayList 操作

于 2013-04-29T04:15:53.220 回答