也许这是一个愚蠢的问题,但我是C#的新手。我有这样一个对象:
MyStructure data = new MyStructure()
{
Name = "Test",
DateTime = "2017-07-14T00:00:00.000Z",
Items = new List<ItemsRequest>
{
new ItemsRequest() { Type = ItemsType.Green, Id = "0020012321" }
}
};
我有验证这种结构的方法:
var badRequests = new Dictionary<Func<bool>, string>
{
[() => myStructure.Name == null] = "Name parameter cannot be empty or null string",
[() => (myStructure.ItemsRequest[0].Type == ItemsType.Green &&
myStructure.ItemsRequest[0].Id == myStructure.ItemsRequest[0].Id && yStructure.ItemsRequest[1].Type == ItemsType.Red &&
myStructure.ItemsRequest[1].Id == myStructure.ItemsRequest[1].Id)] = "could not be created with one with these types",
};
此验证不会通过,因为我的对象中没有2个项目,但是我收到了这样的错误:
发生了'System.ArgumentOutOfRangeException'类型的异常 mscorlib.dll但未在用户代码中处理
其他信息:指数超出范围。必须是非负面的 并且小于集合的大小。
如果列表中只有一个项目并且没有出错,我该如何处理?据我所知,这是因为索引[]。
编辑:当我有一个带有一个项目的结构时:
MyStructure data = new MyStructure()
{
Name = "Test",
DateTime = "2017-07-14T00:00:00.000Z",
Items = new List<ItemsRequest>
{
new ItemsRequest() { Type = ItemsType.Green, Id = "0020012321" }
}
};
在字典中我只验证了这个函数,它成功通过,因为我只选择了一个带有特定条目的项目。
[() => myStructure.ItemsRequest.Select(x => x.Type == ItemsType.Green && x.Id == "0020012321").FirstOrDefault()] = "Type cannot be Green",
但是有没有可能独立于索引并从对象中选择你喜欢的项目?
答案 0 :(得分:1)
以下代码已经过测试并且工作正常,如果这不起作用(正如您之前在评论中提到的那样),那么您的代码肯定会出现其他问题。
我已将Dictionary<Func<bool>, string>
更改为Dictionary<Predicate<MyStructure>, string>
,Predicate<T>
将根据您的条件返回true或false - 并且它将采用T
的参数,其中包含MyStructure
case将是class Program
{
// Create a Dictionary of Key type Predicate<MyStructure>, Predicate returns true or false - no need for a Func<bool>
private static Dictionary<Predicate<MyStructure>, string> badRequests = new Dictionary<Predicate<MyStructure>, string>
{
[p => string.IsNullOrWhiteSpace(p.Name)] = "Name parameter cannot be empty or null string",
[p => p.Items.Count == 2 /* <- This is important, as René pointed out in his answer */ && p.Items[0].Type == ItemsType.Green &&
p.Items[0].Id == "0020012321" && p.Items[1].Type == ItemsType.Red &&
p.Items[1].Id == "9023546547"
] = "could not be created with one with these types"
};
static void Main(string[] args)
{
// Initialize object
MyStructure data = new MyStructure()
{
Name = "Test",
DateTime = "2017-07-14T00:00:00.000Z",
Items = new List<ItemsRequest>
{
new ItemsRequest() { Type = ItemsType.Green, Id = "0020012321" },
new ItemsRequest() { Type = ItemsType.Red, Id = "9023546547" }
}
};
// Call badRequests Dictionary with data to fetch Value
string myString = badRequests.FirstOrDefault(p => p.Key.Invoke(data)).Value;
Console.ReadKey();
}
public class MyStructure
{
public string Name { get; set; }
public string DateTime { get; set; }
public List<ItemsRequest> Items { get; set; }
}
public class ItemsRequest
{
public string Id { get; set; }
public ItemsType Type { get; set; }
}
public enum ItemsType
{
Green, Red
}
}
类型的参数 - 这允许您在方法之外定义集合。
SELECT COUNT(DISTINCT(SONG_ID)) AS PLAY_COUNT,
CLIENT_ID AS CLIENT_ID
FROM `mytable`
WHERE PLAY_TS LIKE '%10/08/2016%'
GROUP
BY CLIENT_ID;
答案 1 :(得分:0)
在访问之前,只需添加测试列表的Count
:
() => (myStructure.ItemsRequest.Count == 2 && // <-- add this line
myStructure.ItemsRequest[0].Type == ItemsType.Green &&
myStructure.ItemsRequest[0].Id == "0020012321" &&
myStructure.ItemsRequest[1].Type == ItemsType.Red &&
myStructure.ItemsRequest[1].Id == "9023546547")
对表达式进行评估&#34;短路&#34;,如果Count
不是2
,则表达式的其余部分不会被评估,因此您不要尝试如果没有第二个元素,则访问列表的索引1
。