如何判断三个值在 IEnumerable<String>里面都存在
时间: 2024-02-05 07:10:33 浏览: 90
可以使用 LINQ 的 `All` 方法,它接受一个 lambda 表达式作为参数,用于判断集合中的所有元素是否都满足某个条件。
示例代码:
```csharp
IEnumerable<string> strings = new[] { "foo", "bar", "baz" };
string[] valuesToCheck = { "foo", "bar", "qux" };
bool allExist = valuesToCheck.All(value => strings.Contains(value));
```
在这个示例中,`valuesToCheck` 数组中的所有值都会被检查,如果它们都存在于 `strings` 集合中,则 `allExist` 变量的值为 `true`,否则为 `false`。
相关问题
class CubeModel : IBufferSource { private const float halfLength = 0.5f; private static readonly vec3[] positions = new vec3[] { new vec3(+halfLength, +halfLength, +halfLength), // 0 new vec3(+halfLength, +halfLength, -halfLength), // 1 new vec3(+halfLength, -halfLength, +halfLength), // 2 new vec3(+halfLength, -halfLength, -halfLength), // 3 new vec3(-halfLength, +halfLength, +halfLength), // 4 new vec3(-halfLength, +halfLength, -halfLength), // 5 new vec3(-halfLength, -halfLength, +halfLength), // 6 new vec3(-halfLength, -halfLength, -halfLength), // 7 }; private static readonly uint[] indexes = new uint[] { 0, 2, 1, 1, 2, 3, // +X faces. 0, 1, 5, 0, 5, 4, // +Y faces. 0, 4, 2, 2, 4, 6, // +Z faces. 7, 6, 4, 7, 4, 5, // -X faces. 7, 5, 3, 3, 5, 1, // -Z faces. 7, 3, 2, 7, 2, 6, // -Y faces. }; public const string strPosition = "position"; private VertexBuffer positionBuffer; // array in GPU side. private IDrawCommand drawCommand; #region IBufferSource 成员 public IEnumerable<VertexBuffer> GetVertexAttribute(string bufferName) { if (strPosition == bufferName) // requiring position buffer. { if (this.positionBuffer == null) { // transform managed array to vertex buffer. this.positionBuffer = positions.GenVertexBuffer( VBOConfig.Vec3, // mapping to 'in vec3 someVar;' in vertex shader. BufferUsage.StaticDraw); // GL_STATIC_DRAW. } yield return this.positionBuffer; } else { throw new ArgumentException("bufferName"); } } public IEnumerable<IDrawCommand> GetDrawCommand() { if (this.drawCommand == null) { // indexes in GPU side. IndexBuffer indexBuffer = indexes.GenIndexBuffer(BufferUsage.StaticDraw); this.drawCommand = new DrawElementsCmd(indexBuffer, DrawMode.Triangles); // GL_TRIANGLES. } yield return this.drawCommand; } #endregion }逐行分段解释上述程序
这段程序定义了一个名为 CubeModel 的类,实现了 IBufferSource 接口。
```c#
class CubeModel : IBufferSource {
```
类中定义了一个常量 halfLength,值为 0.5。
```c#
private const float halfLength = 0.5f;
```
类中定义了一个静态只读的 vec3 数组 positions,包含了八个顶点的位置。
```c#
private static readonly vec3[] positions = new vec3[] {
new vec3(+halfLength, +halfLength, +halfLength), // 0
new vec3(+halfLength, +halfLength, -halfLength), // 1
new vec3(+halfLength, -halfLength, +halfLength), // 2
new vec3(+halfLength, -halfLength, -halfLength), // 3
new vec3(-halfLength, +halfLength, +halfLength), // 4
new vec3(-halfLength, +halfLength, -halfLength), // 5
new vec3(-halfLength, -halfLength, +halfLength), // 6
new vec3(-halfLength, -halfLength, -halfLength), // 7
};
```
类中定义了一个静态只读的 uint 数组 indexes,包含了组成立方体的三角形面的顶点索引。
```c#
private static readonly uint[] indexes = new uint[] {
0, 2, 1, 1, 2, 3, // +X faces.
0, 1, 5, 0, 5, 4, // +Y faces.
0, 4, 2, 2, 4, 6, // +Z faces.
7, 6, 4, 7, 4, 5, // -X faces.
7, 5, 3, 3, 5, 1, // -Z faces.
7, 3, 2, 7, 2, 6, // -Y faces.
};
```
类中定义了一个常量 strPosition,值为 "position"。
```c#
public const string strPosition = "position";
```
类中定义了一个私有的 VertexBuffer 类型的 positionBuffer,用于在 GPU 中存储顶点位置数据。
```c#
private VertexBuffer positionBuffer; // array in GPU side.
```
类中定义了一个私有的 IDrawCommand 类型的 drawCommand,用于在 GPU 中绘制立方体。
```c#
private IDrawCommand drawCommand;
```
接下来是实现 IBufferSource 接口的方法。
```c#
#region IBufferSource 成员
public IEnumerable<VertexBuffer> GetVertexAttribute(string bufferName) {
if (strPosition == bufferName) // requiring position buffer.
{
if (this.positionBuffer == null) {
// transform managed array to vertex buffer.
this.positionBuffer = positions.GenVertexBuffer(
VBOConfig.Vec3, // mapping to 'in vec3 someVar;' in vertex shader.
BufferUsage.StaticDraw); // GL_STATIC_DRAW.
}
yield return this.positionBuffer;
}
else {
throw new ArgumentException("bufferName");
}
}
```
GetVertexAttribute 方法返回一个可枚举的 VertexBuffer 集合,根据输入的 bufferName 参数选择返回的 VertexBuffer。如果 bufferName 的值等于 strPosition 常量的值,则返回存储顶点位置数据的 positionBuffer;否则抛出 ArgumentException 异常。
```c#
public IEnumerable<IDrawCommand> GetDrawCommand() {
if (this.drawCommand == null) {
// indexes in GPU side.
IndexBuffer indexBuffer = indexes.GenIndexBuffer(BufferUsage.StaticDraw);
this.drawCommand = new DrawElementsCmd(indexBuffer, DrawMode.Triangles); // GL_TRIANGLES.
}
yield return this.drawCommand;
}
#endregion
```
GetDrawCommand 方法返回一个可枚举的 IDrawCommand 集合,返回用于绘制立方体的 IDrawCommand。如果 drawCommand 为空,则创建一个 IDrawCommand 对象,存储绘制立方体所需的索引数据,并将其赋值给 drawCommand 变量。然后返回该 drawCommand 变量。
C#中类型Lookup<>的使用
Lookup<TKey, TElement> 类型表示一个键到一组值的映射。与 Dictionary<TKey, TValue> 类型不同,Lookup 类型可以将一个键映射到多个值,这些值被组织在一个 IEnumerable<TElement> 集合中。Lookup 类型通常用于需要对数据进行分组的场景。
以下是 Lookup 类型的使用示例:
```csharp
// 创建一个 Lookup 对象
var lookup = new Lookup<string, int>();
// 添加键值对到 Lookup 对象中
lookup.Add("A", 1);
lookup.Add("A", 2);
lookup.Add("B", 3);
// 获取键为 "A" 的所有值
var valuesA = lookup["A"];
// 遍历 Lookup 对象中的所有键值对
foreach (var group in lookup)
{
var key = group.Key;
var values = group.ToList();
Console.WriteLine($"Key: {key}, Values: {string.Join(",", values)}");
}
```
上述示例中,我们首先创建了一个 Lookup 对象,并向其中添加了三个键值对。其中,“A”键对应了两个值,而“B”键仅对应了一个值。接着,我们通过索引器获取了键为“A”的所有值,并遍历了 Lookup 对象中的所有键值对,输出了它们的键和值。
需要注意的是,Lookup 类型是只读的,它不能直接修改其内部的键值对。如果需要修改 Lookup 对象中的键值对,可以通过创建一个新的 Lookup 对象,并将原 Lookup 对象中的数据转换成新的 Lookup 对象来实现。
阅读全文