循环与自定义类

问题描述:

我正在写一个动态sql查询的where子句,并带有两列'(列表)'样式规则中的列。循环与自定义类

我可以看到几次int ID对,如LocationID/ProductID或TransactionID/FeeID。

下面的示例并不需要放置在方法之外的类,然后从那里的条件删除重复:

var x = (from DataRow row in expected.Rows 
      select row.ItemArray[0]).Distinct().ToArray() 
    var y = (from DataRow row in expected.Rows 
      select row.ItemArray[1]).Distinct().ToArray(); 
    for (int i = 0; i < x.Length; i++) 
    { 
     com.Parameters.AddWithValue("@x" + i, int.Parse(TIDs[i].ToString())); 
    } 
    for (int i = 0; i < y.Length; i++) 
    { 
     com.Parameters.AddWithValue("@y" + i, int.Parse(ItemIDs[i].ToString())); 
    } 

是优选该样品,这是较少的重复的,或者是有一个更好的选择?

public class xy 
    { 
    public int x; 
    public int y; 
    } 
    var xy = (from DataRow row in expected.Rows 
      select new xy() 
      { 
       x = int.Parse(row.ItemArray[0].ToString()), 
       y = int.Parse(row.ItemArray[1].ToString()) 
      }).Distinct().ToArray(); 
    for (int i = 0; i < xy.Length; i++) 
    { 
    com.Parameters.AddWithValue("@x" + i, xy[i].x); 
    com.Parameters.AddWithValue("@y" + i, xy[i].y); 
    } 

双方还需要对querystring += "@x" + i + ", ";

+1

您可以使用内置的System.Drawing.Point结构而不是制作自己的类。 – David

+0

确实第二个编译? –

+0

@SamIam当然不是实际代码中的类和后续代码不是并排的;除非你指的是一个特定的错误,否则该表示是为了简洁起见? – user314321

循环(一个或多个)他们是不同的查询。第一个获得了清单X s和清单Y s。第二个是尝试以获得清单XY组合。但由于xy定义为class而不是struct,因此您将拥有多个具有相同值xy的实例。

如果只获得了不同的组合是不是一个问题,你能避免使用匿名类型为使用自定义类(和避免参考平等问题):

var xy = (from DataRow row in expected.Rows 
      select new 
      { 
       x = int.Parse(row.ItemArray[0].ToString()), 
       y = int.Parse(row.ItemArray[1].ToString()) 
      }).Distinct().ToArray(); 
    for (int i = 0; i < xy.Length; i++) 
    { 
    com.Parameters.AddWithValue("@x" + i, xy[i].x); 
    com.Parameters.AddWithValue("@y" + i, xy[i].y); 
    } 

可能得到更好性能与第二种方法,因为你只枚举一次源列表,但除非这是一个重要的瓶颈,它可能没有总体上有所作为。

这取决于xy是否相关。

如果他们不相关,而你只是对他们做同样的事情,那么不要把他们放在一个班级。如果适用,您可以考虑将重复代码放入方法中,但不要将两个随机值放入类中。

如果它们是相关的,比如它们是一个点的x和y坐标,那么你应该把它们放到一个类中来表示你的观点。


在你的情况下,它也看起来像你可能甚至不需要为他们做一个新的类。他们已经在一个阵列中。

var xy = (from DataRow row in expected.Rows 
     select row).Distinct().ToArray(); 

鉴于我最终使用的代码量,并在运营商使用了不同数量的where子句中的我去

class SqlInHelper 
{ 
    public static string AddTags (DataColumn col) 
    { 
     string colName = col.ColumnName; 
     string addStr = ""; 
     int distinct = (from DataRow row in col.Table.Rows 
        select row[colName]).Distinct().Count(); 
     for(int i=0;i<distinct;i++) 
     { 
      addStr += "@" + colName + i + ", "; 
     } 

     return addStr.Substring(0, addStr.Length - 2); // remove last ", " 
    } 

    public static void AddParams(SqlCommand query, DataColumn col, out bool bValid) 
    { 
     string colName = col.ColumnName; 
     var vals = (from DataRow row in col.Table.Rows 
         select row[colName]).Distinct().ToArray(); 
     if (query.CommandText.Contains("@" + colName + (vals.Length - 1))) { 
      for (int i = 0; i < vals.Length; i++) 
      { 
       query.Parameters.AddWithValue("@" + colName + i, Convert.ChangeType(vals[i], col.DataType)); 
      } 
      bValid = true; 
     } else { 
      bValid = false; 
     } 

    } 
} 

风格上,我认为这样可以让代码少重复,更快的查询(在运算符中比较少做),并且更容易理解。