RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 608978
Accepted
Berianidze Luka
Berianidze Luka
Asked:2020-12-29 01:54:14 +0000 UTC2020-12-29 01:54:14 +0000 UTC 2020-12-29 01:54:14 +0000 UTC

来自字符串的比较符号

  • 772

大家好,这样的东西很有意思,请问是否可以从string中获取比较符号(> < = >= <=)然后使用呢?

public class Main
{

   List<ListItem> ls = new List<ListItem>();
   private void FilterButtonClick(...)
   {
   if(Combobox1.SelectedText == "Id")
   {
       if(Combobox2.Selectedtext == ">=")
       {
       var its = ls.Where(z=>z.Id>=Convert.ToInt32(Textbox1.Text)).ToList();
       for(int i = 0;i<its.Count;i++)
       {
       datagridview.Rows.Add(Its[i].Name);
       }
       else if(Combobox2.Selectedtext == "<=")
       {
       var its = ls.Where(z=>z.Id<=Convert.ToInt32(Textbox1.Text)).ToList();
       for(int i = 0;i<its.Count;i++)
       {
       datagridview.Rows.Add(Its[i].Name);
       }
       }
   }
   else if(Combobox1.SelectedText == "Age")
   {
   if(Combobox2.Selectedtext == ">=")
       {
       var its = ls.Where(z=>z.Age>=Convert.ToInt32(Textbox1.Text)).ToList();
       for(int i = 0;i<its.Count;i++)
       {
       datagridview.Rows.Add(Its[i].Name);
       }
       else if(Combobox2.Selectedtext == "<=")
       {
       var its = ls.Where(z=>z.Age<=Convert.ToInt32(Textbox1.Text)).ToList();
       for(int i = 0;i<its.Count;i++)
       {
       datagridview.Rows.Add(Its[i].Name);
       }
       }
   }
   }

}
public class ListItem
{
string Name;
int Id;
int Age;
int birthday_date;
int Height;
int Weight;
}

我知道用 Switch 编写代码更好。但我在网站上写了,这样更方便。

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    VladD
    2020-12-29T02:05:59Z2020-12-29T02:05:59Z

    例如,对于int:

    Func<int, int, bool> ConstructRelation(string s)
    {
        switch (s)
        {
            case ">":  return (Func<int, int, bool>)((a, b) => a > b);
            case "<":  return (Func<int, int, bool>)((a, b) => a < b);
            case "==": return (Func<int, int, bool>)((a, b) => a == b);
            case ">=": return (Func<int, int, bool>)((a, b) => a >= b);
            case "<=": return (Func<int, int, bool>)((a, b) => a <= b);
            default: throw new ArgumentException("Unknown relation");
        }
    }
    

    像这样使用:

    Func<int, int, bool> rel = ConstructRelation(">");
    Console.WriteLine(rel(5, 4)); // выводит True
    

    工作代码:http: //ideone.com/UWgKlU


    你可以使用这样的东西:

    Func<ListItem, int> firstGetter = null;
    switch (Combobox1.SelectedText)
    {
        case "Id": firstGetter = z => z.Id; break;
        case "Age": firstGetter = z => z.Age; break;
        // тут остальные значения
        default: throw new ArgumentException();
    }
    
    int secondValue = Convert.ToInt32(Textbox1.Text);
    
    Func<int, int, bool> rel = ConstructRelation(Combobox2.Selectedtext);
    
    var its = ls.Where(z => rel(firstGetter(z), secondValue));
    
    foreach(var item in its)
    {
        datagridview.Rows.Add(item.Name);
    }
    
    • 3
  2. user177221
    2020-12-29T02:38:13Z2020-12-29T02:38:13Z

    通过脚本 API:

    > Install-Package Microsoft.CodeAnalysis.CSharp.Scripting
    

    [带有一堆依赖项的包,可能需要很长时间才能下载]

    之后,您可以即时构建代码:

    using System;
    using Microsoft.CodeAnalysis.CSharp.Scripting;
    
    namespace ConsoleApplication27
    {
        public class Globals
        {
            public int X;
            public int Y;
        }
    
        class Program
        {
    
            static void Main(string[] args)
            {
                var globals = new Globals { X = 1, Y = 2 };
                string op = ">";
                Console.WriteLine(CSharpScript.EvaluateAsync<bool>($"X{op}Y", globals: globals).Result);
            }
        }
    }
    

    在实际使用中,值得通过Compile()+RunAsync而不是. 来添加缓存和强制编译EvaluateAsync。


    对于三个比较标志,这就像对麻雀的大炮。如果对象很少,那么最简单的选择是通过比较符号+反射切换,以按名称提取属性。便宜,开朗和可读。

    如果有很多对象,那么您可以尝试组装一个 lambda 以进行动态比较:

    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    using System.Linq;
    
    namespace ConsoleApplication27
    {
        class ListItem
        {
            public int Id { get; set; }
            public int Age { get; set; }
            public string Name { get; set; }
        }
        class Program
        {
            static readonly Dictionary<string, ExpressionType> opsMap =
                new Dictionary<string, ExpressionType>
                {
                    {  ">=", ExpressionType.GreaterThanOrEqual },
                    {  "==", ExpressionType.Equal },
                    {  "<=", ExpressionType.LessThanOrEqual }
                };
    
            static void Main(string[] args)
            {
                string operation = ">=";
                string fieldToCompare = "Age";
                string textToCompare = "15";
                List<ListItem> ls = new List<ListItem>
                {
                    new ListItem { Age = 10, Name = "a" },
                    new ListItem { Age = 20, Name = "b" },
                };
    
                var listItemType = typeof(ListItem);
                var propToCompare = listItemType.GetProperty(fieldToCompare);
    
                var valueToCompare = Convert.ChangeType(textToCompare, propToCompare.PropertyType);
    
                // собираем лямбду x => x.Age >= 15
                var param = Expression.Parameter(listItemType);
                var predicate = Expression.Lambda<Func<ListItem, bool>>(
                    Expression.MakeBinary(opsMap[operation],
                        Expression.Property(param, propToCompare),
                        Expression.Constant(valueToCompare)),
                    param); // .Compile и кэш при необходимости
    
                // убрать AsQueryable если выше используется Compile
                var result = ls.AsQueryable().Where(predicate).ToList();
            }
        }
    }
    
    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5