如果列表中只有一个项目,如何选择两个项目的大小写

时间:2017-02-02 14:40:13

标签: c# dictionary lambda

也许这是一个愚蠢的问题,但我是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",

但是有没有可能独立于索引并从对象中选择你喜欢的项目?

2 个答案:

答案 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