我的代码可能有什么问题?

时间:2018-07-12 20:58:20

标签: c# if-statement

我正在尝试解决其他问题。如果存储在string(id)中的字符不等于13,则程序必须显示“无效长度”,这些字符是在文本框import { Component, OnInit } from '@angular/core'; import * as _ from 'lodash'; @Component({ selector: 'app-hfo', templateUrl: './hfo.component.html', styleUrls: ['./hfo.component.css'] }) export class HfoComponent implements OnInit { students: any; filteredStudents: any; // basic info Sex: string; // child info ProgramCategory: string; ProgramStatus: string; // filter by value filters = { }; constructor() { } ngOnInit() { /// get all students this.students = this.getStudents(); this.setFilters(); } private setFilters() { this.filteredStudents = _.filter(this.students, _.conforms(this.filters) ); } filterMatch(property: string, value: any) { this.filters[property] = i => i === value; this.setFilters(); } filterMatchSub(property: string, childProperty: string, value: any) { this.filters[property] = val => val.find( child => child[childProperty] === value); this.setFilters(); } /// removes filter removeFilter(property: string) { delete this.filters[property]; this[property] = null; this.ProgramCategory = null; this.ProgramStatus = null; this.setFilters(); } private getStudents() { return JSON.parse(` [ { "StudentId": 1, "StudentName": "Student1", "Sex":"M", "Programs": [ { "StudentId": 1, "ProgramName": "Java", "ProgramCategory": "Engineering", "ProgramStatus": "Full Time" }, { "StudentId": 1, "ProgramName": "HR Management 2", "ProgramCategory": "HR", "ProgramStatus": "Part Time" }, { "StudentId": 1, "ProgramName": "Accounting 1", "ProgramCategory": "Finance", "ProgramStatus": "Full Time" } ] }, { "StudentId": 2, "StudentName": "Student2", "Sex":"F", "Programs": [ { "StudentId": 2, "ProgramName": "HR Management 1", "ProgramCategory": "HR", "ProgramStatus": "Part Time" }, { "StudentId": 2, "ProgramName": "Accounting 3", "ProgramCategory": "Finance", "ProgramStatus": "Full Time" } ] }, { "StudentId": 3, "StudentName": "Student3", "Sex":"F", "Programs": [ { "StudentId": 3, "ProgramName": "Java 3", "ProgramCategory": "Engineering", "ProgramStatus": "Full Time" } ] }, { "StudentId": 4, "StudentName": "Student4", "Sex":"M", "Programs": [ { "StudentId": 4, "ProgramName": "Java 2", "ProgramCategory": "Engineering", "ProgramStatus": "Full Time" }, { "StudentId": 4, "ProgramName": "Accounting 2", "ProgramCategory": "Finance", "ProgramStatus": "Part Time" } ] }, { "StudentId": 5, "StudentName": "Student5", "Sex":"M", "Programs": [ { "StudentId": 5, "ProgramName": "JavaScript", "ProgramCategory": "Engineering", "ProgramStatus": "Part Time" }, { "StudentId": 5, "ProgramName": "HR Management 5", "ProgramCategory": "HR", "ProgramStatus": "Full Time" } ] } ] `); } } 中输入的。但是,只要满足此条件,我都会收到错误消息

  

System.ArgumentOutOfRangeException:'索引和长度必须引用字符串中的位置。参数名称:length'

<div class="row">

    <div class="col-sm-12">
        <div class="panel panel-sm ">
            <div class="panel-body">
                <h5>Basic Info</h5>
                <div class="hs-lead">
                    <div class="row">
                        <div class="col-sm-3">
                            <div class="form-group">
                                <label for="exampleSelect1">Sex</label>
                                <div class="row">
                                    <div class="col-sm-9">
                                        <select class="form-control" [(ngModel)]="Sex" (change)="filterMatch('Sex', Sex)">
                                            <option value="M">M</option>
                                            <option value="F">F</option>
                                        </select>
                                    </div>
                                    <div class="col-sm-3">
                                        <button class="btn btn-primary" *ngIf="Sex" (click)="removeFilter('Sex')">
                                            Clear
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </div>
                        <div class="col-sm-3">
                            <div class="form-group">
                                <label for="exampleSelect1">ProgramCategory</label>
                                <div class="row">
                                    <div class="col-sm-9">
                                        <select class="form-control" [(ngModel)]="ProgramCategory" (change)="filterMatchSub('Programs', 'ProgramCategory', ProgramCategory)">
                                            <option value="Engineering">Engineering</option>
                                            <option value="HR">HR</option>
                                            <option value="Finance">Finance</option>
                                        </select>
                                    </div>
                                    <div class="col-sm-3">
                                        <button class="btn btn-primary" *ngIf="ProgramCategory" (click)="removeFilter('Programs')">
                                                Clear
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </div>

                        <div class="col-sm-3">
                            <div class="form-group">
                                <label for="exampleSelect1">ProgramStatus</label>
                                <div class="row">
                                    <div class="col-sm-9">
                                        <select class="form-control" [(ngModel)]="ProgramStatus" (change)="filterMatchSub('Programs', 'ProgramStatus', ProgramStatus)">
                                            <option value="Full Time">Full Time</option>
                                            <option value="Part Time">Part Time</option>
                                        </select>
                                    </div>
                                    <div class="col-sm-3">
                                        <button class="btn btn-primary" *ngIf="ProgramStatus" (click)="removeFilter('Programs')">
                                                Clear
                                        </button>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>

                </div>
            </div>
        </div>

    </div>



</div>

<div class="row">
    <div class="col-sm-12">
        <div class="panel panel-xl">
            <div class="panel-body">
                <h5>Result
                    <span class="badge badge-info badge-pill pull-right">{{ filteredStudents.length }}</span>
                </h5>
                <div class="hs-lead">
                    <div class="table-responsive">
                        <table class="table table-hover">
                            <thead>
                                <tr>
                                    <th>#</th>
                                    <th>Name</th>
                                    <th>Sex</th>
                                    <th>Programs</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr *ngFor="let item of filteredStudents ">
                                    <td>{{item.StudentId }}</td>
                                    <td>{{item.StudentName }}</td>
                                    <td>{{item.Sex}}</td>
                                    <td>
                                        {{item.Programs.length}}

                                        <ol *ngFor="let obj of item.Programs">
                                            <li>{{obj.ProgramCategory}} / {{obj.ProgramStatus}}</li>
                                        </ol>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>

3 个答案:

答案 0 :(得分:1)

.Substring()将引发异常,如果您尝试超出其范围。因此,如果单词“ josh”而您去了"josh".Substring(0,8),则它将抛出异常,因为josh只有4个字母,而我试图将其子字符串化为8。

要解决此问题,请先检查长度

        if (!(txtId.Text.Length==13))
        {
            LblDisp.Text = "Invalid Length";
        }
        else
        {
            string id = txtId.Text; // you do not need to even do SubString now as you know it is a length of 13
            string year = id.Substring(0, 2).ToString();
            string month = id.Substring(2, 2).ToString();
            string day = id.Substring(4, 2).ToString();
            string gender = id.Substring(6, 1).ToString();

            int yy = int.Parse(year);
            int mm = int.Parse(month);
            int dd = int.Parse(day);
            int xx = int.Parse(gender);

            if (!(yy >= 40 && yy <= 99) || (yy >=0 && yy <= 18))
            {
                LblDisp.Text = "Invalid Year";
            } 

答案 1 :(得分:1)

您要尝试的是称为guard cause的模式。

// check for the length first
if (txtId.Text.Length < 13)
{
    LblDisp.Text = "Invalid Length";
    return;
}

// use substring later. You dont want to substring on a short string.
// If you try you can get ArgumentOutOfRangeException.
string id = txtId.Text;
string year = id.Substring(0, 2); // substring returns a string
string month = id.Substring(2, 2);
string day = id.Substring(4, 2);
string gender = id.Substring(6, 1);

// by the way, you should check if all this chars are numbers. You can use int.TryParse for this.
int yy = int.TryParse(year);
int mm = int.Parse(month);
int dd = int.Parse(day);
int xx = int.Parse(gender);

if (!(yy >= 40 && yy <= 99) || (yy >=0 && yy <= 18))
{
    LblDisp.Text = "Invalid Year";
}

答案 2 :(得分:0)

如果您提供的参数无效,

.Substring()将失败并显示该错误。

即如果字符串少于13个字符,而您尝试采用13个字符的子字符串,则会出现该错误。