0

我有 2 个列表,如下所述

我如何验证 lstOldItems 中存在的所有sitempath值也存在于lstNewItems

C# 代码

List<ItemsUnderControlObject> lstNewItems
List<ItemsUnderControlObject> lstOldItems


public class ItemsUnderControlObject
{
 public ItemsUnderControlObject();

 public bool bButtonEnabled { get; set; }
 public short iChkInterval { get; set; }
 public int iItemUnderCtrlUniqueID { get; set; }
 public DateTime? ItemCreationDateTime { get; set; }
 public DateTime? ItemLastAccessDateTime { get; set; }
 public DateTime? ItemLastModifiedDateTime { get; set; }
 public long lngItemSize { get; set; }
 public string sItemBackupLocation { get; set; }
 public string sItemcategory { get; set; }
 public string sItemCurrentStatus { get; set; }
 public DateTime sItemDatabaseCreationDateTime { get; set; }
 public string sItemName { get; set; }
 public string sItemPath { get; set; }
 public string sItemRequestStatus { get; set; }
 public string sItemTask { get; set; }
 public string sItemValue { get; set; }
 public string sItemValueSHA256 { get; set; }
 public string sSystemID { get; set; }
}
4

4 回答 4

3

为什么不使用这里看到Except的 LINQ 的扩展方法:

var oldItemPaths = lstOldItems.Select(l => l.sItemPath).Distinct();
var newItemPaths = lstNewItems.Select(l => l.sItemPath).Distinct();
bool isSame = !oldItemPaths.Except(newItemPaths).Any();

或者,使用@Magnus 的方式和上面的代码(减去Except):

bool isSame = oldItemPaths.All(x => newItemPaths.Contains(x));
于 2013-02-25T21:54:48.527 回答
2

为了快速查找,首先将项目添加lstNewItems到 aHashSet中,而不是使用All

var set = new HashSet<string>(lstNewItems.Select(x => x.sItemPath));
var res = lstOldItems.All(x => set.Contains(x.sItemPath));
于 2013-02-25T21:59:30.480 回答
2

一个班轮,以防您不想将路径提取到不同的列表:

stOldItems.All(x => lstNewItems.Any(y=> x.sItemPath == y.sItemPath));
于 2013-02-25T22:01:36.553 回答
1

试试linq,

类似的东西

List<string> sitempaths = lstNewItems.Select(i => i.sitempath).ToList();

bool hasSitempaths = lstOldItems
    .Where(x => sitempaths.contains(x.sitempath)).ToList()
    .Count == lstOldItems.Count;

请注意,这实际上并未经过测试,您可能需要调整

于 2013-02-25T21:57:07.223 回答