更有效的方法为foreach循环添加数据库项目到结果列表?



是否有更有效的方法将foundItems添加到resultList(例如,更有效的LINQ查询/更有效的foreach循环)?

// Ex: Local List
var localSysList1 = new List<SomeType1>()
{
new SomeType1 { Id = "1", Name = "Spinach", Value = "TXT_FLD_SPINA", ExtraInfo = "something1" },
new SomeType1 { Id = "2", Name = "Broccoli", Value = "TXT_FLD_BRO", ExtraInfo = "something else5" },
new SomeType1 { Id = "3", Name = "Wheatgrass", Value = "TXT_FLD_WHE", ExtraInfo = "something else4" },
};
// Ex: Retrieved from DbContext
var databaseList = new List<SomeType1>()
{
new SomeType1 { Id = "1", Name = "Spinach", Value = "TXT_FLD_SPINA", ExtraInfo = "Some additional info" },
new SomeType1 { Id = "4", Name = "Banana", Value = "TXT_FLD_BANA", ExtraInfo = "something else" },
new SomeType1 { Id = "5", Name = "Tomatoes", Value = "TXT_FLD_TOM", ExtraInfo = "something else2" },
};
List<SomeType1> resultList = new List<SomeType1>();
foreach (var localItem in localSysList1)
{
var foundItems = databaseList.Where(x => x.Id == localItem.Id);
resultList.Add(foundItems);
}

自己编写相等比较器

对于循环中的每个对象,它将.Where调用要快得多。因为你有一个本地列表,看起来ORM优化并不是你真正想要的。

应该可以。

Main.cs

...
var eqComparer = new SomeType1EqualityComparer();
var resultList = localSysList1.Intersect(databaseList, eqComparer).ToList();

SomeType1EqualityComparer.cs

public class SomeType1EqualityComparer : IEqualityComparer<SomeType1>
{
public bool Equals(SomeType1 x, SomeType1 y)
{
if (ReferenceEquals(x, y))
return true;
if (ReferenceEquals(x, null))
return false;

if (ReferenceEquals(y, null))
return false;
if (x.GetType() != y.GetType())
return false;

return x.Id == y.Id && x.Name == y.Name && x.Value == y.Value && x.ExtraInfo == y.ExtraInfo;
}
public int GetHashCode(SomeType1 obj)
{
return HashCode.Combine(obj.Id, obj.Name, obj.Value, obj.ExtraInfo);
}
}