【问题标题】:C# change linq list (int) item to (string)C# 将 linq list (int) item 更改为 (string)
【发布时间】:2014-01-24 02:51:34
【问题描述】:

我的任务是解决别人制作的 C# 应用程序中的一些问题(有人离开了公司),我并不是一个真正合格的 C# 程序员,这只是一种爱好,所以我有点坚持以下几点。

var JobQuery = (from datavalue in dc.JobInformations
    where datavalue.JobOpen != 20
    select new
    {
    datavalue.JobID,
    datavalue.CompanyName,
    datavalue.Contact,
    datavalue.Date,
    datavalue.HireOrSale,
    datavalue.JobOpen,
    datavalue.Notes
    }
    );

var JobList = JobQuery.ToList();

无论如何,我需要获取列表并循环遍历它,我可以使用以下方法:

foreach (var item in JobList){
    if (item.HireOrSale = 1)    {
        item.HireOrSale = "Sale";
    }   
    yield return item;
}

正如您所看到的,我想要做的是将作为 INT 存储的 Hire 或 Sale 更改为字符串以便在前端更好地阅读,我无法将字符串转换为 int,这是我得到的地方卡住。有没有办法我可以说在循环中构建另一个列表,以允许我为每个列表定义数据类型以防万一?或者有没有办法直接更改项目数据类型?

使用:

            var JobList = (from datavalue in dc.JobInformations
                           where datavalue.JobOpen == 1
                           select new
                           {
                               JobID = datavalue.JobID,
                               CompanyName = datavalue.CompanyName,
                               Contact = datavalue.Contact,
                               Date = datavalue.Date.ToShortDateString(),
                               HireOrSale = datavalue.HireOrSale == 2 ? "Service" :
                               datavalue.HireOrSale == 0 ? "Hire" :
                               datavalue.HireOrSale == 1 ? "Sale" : "",
                               JobOpen = datavalue.JobOpen == 1 ? "Awaiting Quote" :
                               datavalue.JobOpen == 2 ? "Quoted" :
                               datavalue.JobOpen == 3 ? "PO Recieved" :
                               datavalue.JobOpen == 4 ? "Goods On Order" :
                               datavalue.JobOpen == 5 ? "Goods Delivered" :
                               datavalue.JobOpen == 6 ? "Job Complete" :
                               datavalue.JobOpen == 20 ? "Job Cancelled" : "",
                               Notes = datavalue.Notes
                           }
                           );

【问题讨论】:

  • 如果HireOrSale 的值数量有限且数量有限,我将为它创建一个enum 并使用枚举的整数值来获取枚举名称(即调用ToString() 在枚举 value).

标签: c# .net linq list loops


【解决方案1】:

为了扩展蒂姆对您问题的评论,如果您有多个选项,每个选项都映射到一个数字,这可能是enum 的一个非常好用处:

public enum HireOrSale
{
    None = 0,
    Sale = 1,
    SomethingElse = 2,
    MoreStuff = 3
}

然后在您的 LINQ 语句中,您可以执行 HireOrSale = (HireOrSale)datavalue.HireOrSaleint 转换为正确的 enum 值。

当需要显示它时,您可以调用ToString,它会打印出enum 的名称。例如,下面的一小段代码将打印“Sale”。

int input = 1;
HireOrSale enumValue= (HireOrSale)input;
String displayValue = enumValue.ToString();

【讨论】:

    【解决方案2】:

    正确的解决方案,是创建另一个对象,只包含前端所需的信息(A Viewmodel),其中只包含 JobInformation 需要显示的字段:

    一个例子是......

    JobInfoViewModel

    字符串 HireOrSale int JobId DateTime 日期

    然后您将创建一个列表并使用它!

    这样,你只将需要的信息传递给前端,不多也不少!

    【讨论】:

      【解决方案3】:
      var JobQuery = (from datavalue in dc.JobInformations
          where datavalue.JobOpen != 20
          select new
          {
             JobID = datavalue.JobID,
             CompanyName = datavalue.CompanyName,
             Contact = datavalue.Contact,
             Date = datavalue.Date,
             HireOrSale = datavalue.HireOrSale==1?"Sale":"",//if not 1, use your default value
             JobOpen = datavalue.JobOpen,
             Notes = datavalue.Notes
          }
          );
      
      var JobList = JobQuery.ToList();
      

      【讨论】:

      • 最终使用了类似的东西,请参阅我的原始帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-25
      相关资源
      最近更新 更多