我正在使用两个“(列表)中的列”样式规则编写动态 sql 查询的 where 子句。
我可以多次看到这种情况出现在 int ID 对上,例如 LocationID/ProductID 或 TransactionID/FeeID。
以下示例不需要将类放在方法之外,并从 WHERE 条件中删除重复项:
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 + ", ";
最佳答案
它们是不同的查询。第一个获得一个不同的列表 X
s 和一个不同的列表 Y
秒。第二个是试图获得X
的不同列表。和 Y
组合。然而自xy
被定义为 class
而不是 struct
您将拥有多个具有相同值 x
的实例和 y
.
如果只关心不同的组合,您可以通过使用匿名类型来避免使用自定义类(并避免引用相等性问题):
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);
}
您可能使用第二种方法获得更好的性能,因为您只枚举了一次源列表,但除非这是一个重大瓶颈,否则它可能不会对整体产生影响。
关于c# - 循环与自定义类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211574/