我开始比较我的小项目的列表。到目前为止,我可以比较是否存在相同的项目,或者该项目的一个值是否适合另一个列表项目的相同值。 Atm 我正在比较两个列表中的名字。我出于我的目的更改了一些找到的代码。
public class TestResources
{
public string Name;
public int Amount;
public TestResources(string name, int amount)
{
Name = name;
Amount = amount;
}
}
TestResources[] ListResInStock = { new TestResources("wood", 1000), new TestResources("stone", 1000), new TestResources("sand", 1000), new TestResources("water", 1000) };
TestResources[] ListResNeeded = { new TestResources("wood", 800), new TestResources("stone", 800), new TestResources("sand", 375) };
private bool ContainsResourceName(IEnumerable<TestResources> ListResNeeded, IEnumerable<TestResources> ListResInStock)
{
bool result;
var list1WithName = ListResNeeded.Select(s => s.Name).ToList();
var list2WithName = ListResInStock.Select(s => s.Name).ToList();
result = !list1WithName.Except(list2WithName).Any();
return result;
}
该函数的调用方式为:
Console.WriteLine("ListResInStock contains ListResNeeded: ===> " + ContainsResourceName(ListResNeeded, ListResInStock) + " <==="); // True
Console.WriteLine("ListResNeeded contains ListResInStock: ===> " + ContainsResourceName(ListResInStock, ListResNeeded) + " <==="); // False
现在我想更改它,以便仅当 ressNeeded 的名称存在且 ressInStock 的数量 >= RessNeeded 的数量(当然对于所有资源)时才返回 true。
另外,如果你可以解释这部分var list1WithName = ListResNeeded.Select(s => s.Name).ToList();
对我来说详细一点会很好,因为我不是100%确定什么确实如此。
我真的很感谢你的帮助:-)
最佳答案
很简单
private bool ContainsResourceName(IEnumerable<TestResources> ListResNeeded, IEnumerable<TestResources> ListResInStock)
{
return ListResNeeded.All(resNeeded =>
ListResInStock.Any(resInStock =>
resInStock.Name == resNeeded.Name &&
resInStock.Amount >= resNeeded.Amount
)
);
}
理解.Select
、.All
、.First
以及许多其他所谓的IEnumerable
函数的含义code> 接口(interface),你就必须学习 C# 中的惰性求值,而且有太多要说的了。
ListResNeeded.Select(s => s.Name).ToList();
和其他带有枚举器的操作更容易从末尾读取。因此,从最后开始:您创建一个由 Select
函数生成的元素列表(什么?)(它会生成什么?)它需要一个资源 s
并返回 s.Name
(这些资源从哪里来?)来自 ListResNeeded 列表。
同样,您必须阅读有关 C# 中的 IEnumerator
以及一般惰性求值的更多信息。这是编程中的一个重要概念。
附注以及有关您尝试使用的代码的一些警告。你在那里做什么:
var list1WithName = ListResNeeded.Select(s => s.Name).ToList();
var list2WithName = ListResInStock.Select(s => s.Name).ToList();
正在完整复制传递给函数的两个参数(想象一下这些数组会大得多,复制它们有什么意义?)。
在完全遍历完前两个列表后,您将创建一个新(第三个)列表,而您实际寻找的只是一个 bool 答案。
result = !list1WithName.Except(list2WithName).Any();
在知道答案为假之前,您不必完全遍历这两个列表。您只需找到缺少的第一个资源,然后停止搜索(这样要轻得多)
关于c# - C# 中的高级列表比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60800388/