查询存在多个同名元素的列表

时间:2015-02-08 21:28:29

标签: c# linq list

Windows窗体应用

好的抱歉,我有一节课

public class comm
   {

      private int dayV;
      private string timeV;
      private decimal priceV;
      private string nameValue;
      private string descriptionV;

      public comm(string Day, string Time, string Price, string Name, string Description)
      {
         try
         {
            this.dayV = Convert.ToInt32(Day);
         }
         catch (Exception ex)
         {

         }

         this.timeV = Time;
         decimal PriceVal;
         var irishCulture = CultureInfo.CreateSpecificCulture("en-IE");
         if (decimal.TryParse(Price, NumberStyles.Currency, irishCulture, out PriceVal))
         {
            this.priceV = Convert.ToDecimal(PriceVal);
         }
         this.nameValue = Name;
         this.descriptionV = Description;
      }


      public int GetDay() { return dayV; }
      public string GetTime() { return timeV; }
      public string GetPrice() { return (Convert.ToString(priceV)); }
      public string GetName() { return nameValue; }

      // Returns full event Description
      public string Description()
      {
         string price = "Price: ";
         return timeV + "\r\n" + price + "€" + priceV + "\r\n" + this.descriptionV;
      }
   }

我将文本文件读入List并将每个字段分配到相应的类实例变量中。

文本文件如下所示

1,02:29 pm,€55.00,John D,Main st 
1,05:43 pm,€70.00,John D,Bridge st
2,01:43 pm,€100.00,Mike O,First Floor A12
1,10:44 am,€100.00,Colm Collins,First Floor A13
2,11:44 am,€110.00,Martin O, Exp 01

读取文件的方法。

    public List<communityEvent> CreateList()
          {
             List<comm> entries = new List<comm>();
             try
             {
                StreamReader fileIn = new StreamReader(path);
                //Read the file
                while (!fileIn.EndOfStream)
                {
                   String line = fileIn.ReadLine();
                   String[] pieces = line.Split(',');
                   if (pieces.Length == 5)
                   {
                      comm Eve = new comm(pieces[0], pieces[1], pieces[2], pieces[3], pieces[4]);
                      entries.Add(Eve);
                   }
        return entries;

在主程序中

    private List<comm> various;



    private void ExtractData(string eventComboBox)
{
    var query = from v in various
                     where vComboBox == v.GetName()
                     select v.Description();

         foreach (var vr in query)
         {
            descriptionTextBox.Text = vr;
         }
}

因此组合框内容如下所示: -

             John D
             John D
             Colm Collins
             Martin O

我想要的是,每次用户选择不同的名称。 我得到相应的描述()例如。选择后的第一个John D将使用Description()填充描述文本框,Description()应该是该行的字段。 我遇到的问题是,有些名称是相同的,描述只返回所有具有相同名称的人的第一个描述(),无论我选择哪一个。

3 个答案:

答案 0 :(得分:1)

感谢您提供的补充信息。它仍然含糊不清 - 我不知道“个别描述”是什么意思,因为你写了,并且你的新数据示例显示,数据中可以有多个匹配。当您选择与多个名称匹配的名称时,没有“ 个人描述”。

也就是说,如果您只想要一个描述,那么您真正想要的是将ComboBox中的单个项与单个关联起来您填充ComboBox的数据中的项目。

很遗憾,您仍然没有按要求提供完整的代码示例。因此无法知道ComboBox是如何填充的,甚至不知道如何声明various变量。但是你说数据被“读入一个列表”,所以让我们假设:

  • 您的某些类型DataRow代表文件中的单行文字
  • various被声明为List<DataRow>
  • ComboBox中的项目顺序与various列表中的项目顺序完全相同

如果上述内容都是正确的(并且没有完整的代码示例,那么读取您的问题的任何人都无法确切地知道它),那么您根本不需要或者想要查询数据。 您已经知道所选项目的确切索引!

让我们进一步假设:

  • 您的ComboBox的名称是“comboBox1”,并且您的代码中有一个名为comboBox1的字段,该字段引用了ComboBox个实例

在这种情况下,以下代码应足以替代您提供的整个代码示例:

descriptionTextBox.Text = various[comboBox1.SelectedIndex].Description();

这将检索ComboBox中当前选择的索引,然后使用该索引(因为ComboBox中的数据顺序应与List<DataRow>中的完全相同})从DataRow检索List<DataRow>值,以便调用Description()方法获取该行数据的实际描述并将其分配给descriptionTextBox } Text属性。

如果您的ComboBox名称不同,只需使用正确的名称,而不是上面的comboBox1

同样,如果这不能解决您的问题,请在问题中添加详细信息。提供最小的 完整的 代码示例,并准确解释它的作用以及它与您希望发生的事情的不同之处。

答案 1 :(得分:0)

试试这个,

descriptionTextBox.Text = various[comboBox.SelectedIndex].Description();

答案 2 :(得分:0)

感谢大家的帮助,以下是对我有用的 我创建了一个方法并将组合框文本和索引输入其中。

    private void ExtractData(string eventComboBo, int index)
  {

     var query = from v in various
                 where eventComboBo == v.GetName() && eventComboBox.SelectedIndex.Equals(index)
                 select v.Description();

     foreach (var ev in query)
     {
        descriptionTextBox.Text = ev;
     }